Microsoft JSON日付をフォーマットするにはどうすればよいですか?


2000

私は、jQueryを使用してAjaxで最初のクラックを行っています。ページにデータを取得していますが、Dateデータ型で返されるJSONデータに問題があります。基本的に、次のような文字列が返されます。

/Date(1224043200000)/

JSONをまったく知らない人から-これを短い日付形式にフォーマットするにはどうすればよいですか?これはjQueryコードのどこかで処理する必要がありますか?をjQuery.UI.datepicker使用してプラグインを試しましたが、$.datepicker.formatDate()成功しませんでした。

参考までに、ここに答えの組み合わせを使用して私が思いついた解決策があります:

function getMismatch(id) {
  $.getJSON("Main.aspx?Callback=GetMismatch",
    { MismatchId: id },

    function (result) {
      $("#AuthMerchId").text(result.AuthorizationMerchantId);
      $("#SttlMerchId").text(result.SettlementMerchantId);
      $("#CreateDate").text(formatJSONDate(Date(result.AppendDts)));
      $("#ExpireDate").text(formatJSONDate(Date(result.ExpiresDts)));
      $("#LastUpdate").text(formatJSONDate(Date(result.LastUpdateDts)));
      $("#LastUpdatedBy").text(result.LastUpdateNt);
      $("#ProcessIn").text(result.ProcessIn);
    }
  );

  return false;
}

function formatJSONDate(jsonDate) {
  var newDate = dateFormat(jsonDate, "mm/dd/yyyy");
  return newDate;
}

このソリューションでは、コールバックメソッドからオブジェクトを取得し、日付形式ライブラリを使用してページに日付を適切に表示しました。


26
:これは面白いかもしれませんhanselman.com/blog/...を
citronas

6
/Date(...)/形式は、Microsoftの組み込みJSON日付形式に固有です。これは標準の一部ではなく、JavaScriptからのJSONには標準があります。ISO形式Javascriptは次のように指定します:stackoverflow.com/a / 15952652/176877 したがって、この質問はMicrosoftのJSON日付形式に固有のものです。これを明確にするために、タイトルを変更しました。
Chris Moschini、2014年

15
冗談でしょう!マイクロソフトは、独自のスピンをJSONに刻印しました!そして日付に!! 彼らはいつ学ぶのでしょう!
Nick.McDermaid 2016

.NET側でNewtonsoft JSONを使用し、JS側で適切
RickStrahl

JSONの代わりにJSON ++を使用できます。JSON ++JSONと同じですが、などのJavaScriptタイプをサポートしていますDate
brillout '14年

回答:


1688

eval()必要ありません。これはうまくいきます:

var date = new Date(parseInt(jsonDate.substr(6)));

substr()関数は、取り出し/Date(部、及びparseInt()機能は、整数を取得し、無視)/終わりに。結果の数値はDateコンストラクターに渡されます。


基数を意図的に省略しました(の2番目の引数parseInt)。以下の私のコメントを参照しください。

また、私はRoryのコメントに完全に同意します。ISO-8601の日付はこの古い形式よりも優先されるため、この形式は通常、新しい開発には使用しないでください。ISO-8601形式を使用して日付をシリアル化する優れた代替手段については、優れたJson.NETライブラリを参照してください。

ISO-8601形式のJSON日付の場合、文字列をDateコンストラクタに渡します。

var date = new Date(jsonDate); //no ugly parsing needed; full timezone support

4
@Broam:MSが形式を変更する場合、両方の方法(置換機能とこの回答)を変更する必要があります。
ロイティンカー

23
基数var date = new Date(parseInt(jsonDate.substr(6)、10));で更新してください。
James Kyburz、2012

6
@JamesKyburz:すべてのルールには例外があり、例外が適用されるのはこのときだと思います。.NETからJSONの日付番号は、決して私たちが安全に基数を残すことができますので、先頭の「0」を持っていません。
ロイ・ティンカー

22
この日付形式はかなり悪く、JSONでISO-8601形式の日付に移行するのが一般的です。参照してくださいhanselman.com/blog/...
ロリー・

4
このアプローチはタイムゾーンを考慮しないため、サーバーとユーザーが異なるタイムゾーンにいる場合に深刻な問題を引き起こす可能性があります。WCFとJavascriptの側でこれに対処するための非常に迅速で簡単な方法を説明する回答を以下に投稿しました:stackoverflow.com/a/10743718/51061
Scott Willeke

135

これを使用して、JSONから日付を取得できます。

var date = eval(jsonDate.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));

そして、JavaScript日付フォーマットスクリプト(縮小してgzip圧縮した場合は1.2 KB)を使用して、必要に応じて表示できます。


7
行に問題はありません。シーケンスは\ //です。最初のスラッシュはエスケープされるため、コメントのようにカウントされません。それはあなたをだますあなたのエディタです、ラインはうまくいきます。
andreialecu 2009

152
@rball、ナンセンス:jsonDate = new Date(+jsonDate.replace(/\/Date\((\d+)\)\//, '$1'));
まぶたの

39
pstは正しかった、これを「評価」なしでさまざまな方法で行うことが可能です。Crockford氏は、「eval Is Evil」は読みにくく、安全性が低いため、JavaScriptコンパイラーにヒットするため、効率と危険性が低下することを示唆しています。
マークロジャース

13
@Edy:new Functionほぼ同じ悪いようですevaldev.opera.com/articles/view/efficient-javascript/...
マルセルKorpel

5
@Edy:これは評価のもう1つの形式であり、「悪」と同じです。代わりに文字列を解析します(下の私の回答を参照)
Roy Tinker

98

Newtonsoft Json.NETを使用している方は、IE8、Firefox 3.5およびJson.NETでネイティブJSONを使用して実行する方法を読んでください

また、Json.NETによって書き込まれた日付の形式の変更に関するドキュメントも役立ちます。Json.NETを使用した 日付のシリアル化

怠惰すぎる人のために、ここに簡単な手順があります。JSONには緩やかなDateTime実装があるため、を使用する必要がありますIsoDateTimeConverter()。Json.NET 4.5以降、デフォルトの日付形式はISOなので、以下のコードは必要ありません。

string jsonText = JsonConvert.SerializeObject(p, new IsoDateTimeConverter());

JSONは、

"fieldName": "2009-04-12T20:44:55"

最後に、ISO日付をJavaScript日付に変換するいくつかのJavaScript:

function isoDateReviver(value) {
  if (typeof value === 'string') {
    var a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(?:([\+-])(\d{2})\:(\d{2}))?Z?$/.exec(value);
      if (a) {
        var utcMilliseconds = Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]);
        return new Date(utcMilliseconds);
      }
  }
  return value;
}

このように使った

$("<span />").text(isoDateReviver(item.fieldName).toLocaleString()).appendTo("#" + divName);

6
JavaScriptのDateコンストラクタはあなたのための文字列を解析することができますnew Date("2009-04-12T20:44:55")
デヴィッド・ホーグ

5
警告-Date()コンストラクターの形式と解析はECMAScript 6より前の標準ではありません。たとえば、IE 9は、コンストラクターに指定した日付を、他の場所ではUCTとして暗黙的に示されるIS0-8601にある場合でも、現地時間として扱います。古いブラウザをサポートしている場合は、日付コンストラクタに依存しないでください。 codeofmatt.com/2013/06/07/...
端午

UTC以外の日付を送信すると、遅かれ早かれ問題が発生します。
ティムタム

ここのパーティーには少し遅れますが、どうなるか(+ a [1]、+ a [2]-1、+ a [3]、+ a [4]、+ a [5]、+ a [6]) ; このコンテキストで表す?
yanant

@yanant - +a[1]などが正規表現の配列の部分を表し、+数にキャストだろう、そう+a[1]等しい2009。ここなどは、配列の内訳である: 0: "2009-04-12T20:44:55" 1: "2009" 2: "04" 3: "12" 4: "20" 5: "44" 6: "55"
ジェイソン・ヨング

67

元の例:

/Date(1224043200000)/  

組み込みのJSONシリアル化を使用してWCF REST経由で日付を送信するときにWCFが使用するフォーマットを反映していません。(少なくとも.NET 3.5、SP1)

私はここで答えを参考にしたが、タイムゾーンGMTオフセットがWCF JSONで返された数値(1970以降)に追加されているように見えるため、正規表現を少し編集する必要があります。

WCFサービスでは、次のようになっています。

[OperationContract]
[WebInvoke(
    RequestFormat = WebMessageFormat.Json,
    ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.WrappedRequest
    )]
ApptVisitLinkInfo GetCurrentLinkInfo( int appointmentsId );

ApptVisitLinkInfoは簡単に定義されます:

public class ApptVisitLinkInfo {
    string Field1 { get; set; }
    DateTime Field2 { get; set; }
    ...
}

「Field2」がサービスからJsonとして返される場合、値は次のとおりです。

/Date(1224043200000-0600)/

タイムゾーンのオフセットが値の一部として含まれていることに注意してください。

変更された正規表現:

/\/Date\((.*?)\)\//gi

それは少し熱心で、最初の数字だけでなく、括弧の間のすべてをつかみます。結果として生じる1970年の時刻sinzeとタイムゾーンオフセットをすべてevalに入力して、日付オブジェクトを取得できます。

置換の結果のJavaScript行は次のとおりです。

replace(/\/Date\((.*?)\)\//gi, "new Date($1)");

10
これは間違っています。新しい日付(1224043200000-0600)は日付から600を減算するだけです。この場合、600ミリ秒であり、本来の6時間ではありません。
アリエル


タイムゾーンオフセットは、.NETのDateTimeオブジェクトにタイムゾーンがある場合にのみ含まれると思います(これがデフォルトの動作です)。日付がUTCの場合は、DateTime.SpecifyKind(date、DateTimeKind.UTC)を使用すると、シリアル化されたときにオフセットなしで適切なUTC値が取得され、必要に応じてユーザーのタイムゾーンに戻すことができます。現地時間の場合は、.ToUniversalTime()を使用すると、UTCに変換され、「種類」がすでに指定されています。
jvenema 2013

javascript -0100はバイナリ文字列になるので注意してください。
verbedr 2015

日付をWCFからJSに変換したら、逆にしてみてください。あなたは同じWCFに渡したい整数として日付を取得しなければなりません(date.getTime()を使用)?
NitinSingh 2017年

65

繰り返さないでください-を使用して日付変換を自動化します $.parseJSON()

あなたの投稿への回答は、JavaScript日付への手動の日付変換を提供します。私はjQueryを$.parseJSON()少しだけ拡張したので、指示されたときに日付を自動的に解析できます。これは、ブラウザー(およびjson2.jsなどのライブラリー)のネイティブJSON関数でサポートされているASP.NET形式の日付(/Date(12348721342)/)およびISO形式の日付(2010-01-01T12.34.56.789Z)を処理します。

とにかく。日付変換コードを何度も繰り返したくない場合は、このブログ投稿を読んで、生活を少し楽にするコードを入手することをお勧めします。


61

JavaScriptで言うと

var thedate = new Date(1224043200000);
alert(thedate);

それが正しい日付であることがわかり、JavaScriptの任意のフレームワークで任意の場所で使用できます。


3
結局次のようになる以外は、私もそう思っていたでしょう。var thedate = / Date(1224043200000)/; 少なくとも私にとっては...
rball 2009

2
Date()とDate(1224043200000)はどちらもChromeとFirefoxの両方で同じ結果になります。これが古いブラウザで機能したかどうかはわかりませんが、この回答は現在ブラウザでは機能しません。
ジェームズ

@ジェームス、はい、それはブラウザに現在の日付を与えています。:(
vissu

9
「new Date(1224043200000)」と書く必要があります。
BrainSlugs83 2012

60

デモを確認するにはここをクリックしてください

JavaScript / jQuery

var = MyDate_String_Value = "/Date(1224043200000)/"
var value = new Date
            (
                 parseInt(MyDate_String_Value.replace(/(^.*\()|([+-].*$)/g, ''))
            );
var dat = value.getMonth() +
                         1 +
                       "/" +
           value.getDate() +
                       "/" +
       value.getFullYear();

結果 -「2008/10/15」


上記の方法の単なる改善。function formatearFecha(fec){var value = new Date(parseInt(fec.replace(/(^。*()|([+-]。* $)/ g、 ''))); var mes = value.getMonth (); var dia = value.getDate(); var date = dia + "/" + mes + "/" + value.getFullYear(); if(dia <10)date = date.substr(0、0)+ '0' + dia + date.substr(1); if(mes <10)date = date.substr(0、3)+ '0' + mes + date.substr(4); return date;}日付の形式ddMMyyyy。乾杯!
Matias

38

更新しました

/Date(msecs)/ここで最初に尋ねられたようなMicrosoftのASP.NET組み込みJSON形式と、JSON.NETを含むほとんどのJSONの日付形式の両方に対応する必要がある内部UIライブラリがあります2014-06-22T00:00:00.0。さらに、oldIEが小数点以下3桁を処理できないことにも対処する必要があります。

まず、消費している日付の種類を検出し、それを解析して通常のJavaScript Dateオブジェクトに変換してから、フォーマットします。

1)Microsoft日付形式を検出する

// Handling of Microsoft AJAX Dates, formatted like '/Date(01238329348239)/'
function looksLikeMSDate(s) {
    return /^\/Date\(/.test(s);
}

2)ISO日付形式を検出する

var isoDateRegex = /^(\d\d\d\d)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)(\.\d\d?\d?)?([\+-]\d\d:\d\d|Z)?$/;

function looksLikeIsoDate(s) {
    return isoDateRegex.test(s);
}

3)MS日付形式を解析します。

function parseMSDate(s) {
    // Jump forward past the /Date(, parseInt handles the rest
    return new Date(parseInt(s.substr(6)));
}

4)ISO日付形式を解析します。

少なくとも、標準のISO日付、または常に3ミリ秒の位置(上記を参照)を持つように変更されたISO日付を確実に処理する方法があるため、コードは環境によって異なります。

4a)標準のISO日付形式を解析し、oldIEの問題に対処します。

function parseIsoDate(s) {
    var m = isoDateRegex.exec(s);

    // Is this UTC, offset, or undefined? Treat undefined as UTC.
    if (m.length == 7 ||                // Just the y-m-dTh:m:s, no ms, no tz offset - assume UTC
        (m.length > 7 && (
            !m[7] ||                    // Array came back length 9 with undefined for 7 and 8
            m[7].charAt(0) != '.' ||    // ms portion, no tz offset, or no ms portion, Z
            !m[8] ||                    // ms portion, no tz offset
            m[8] == 'Z'))) {            // ms portion and Z
        // JavaScript's weirdo date handling expects just the months to be 0-based, as in 0-11, not 1-12 - the rest are as you expect in dates.
        var d = new Date(Date.UTC(m[1], m[2]-1, m[3], m[4], m[5], m[6]));
    } else {
        // local
        var d = new Date(m[1], m[2]-1, m[3], m[4], m[5], m[6]);
    }

    return d;
}

4b)小数点以下3ミリ秒に固定されたISO形式の解析-はるかに簡単:

function parseIsoDate(s) {
    return new Date(s);
}

5)フォーマットする:

function hasTime(d) {
    return !!(d.getUTCHours() || d.getUTCMinutes() || d.getUTCSeconds());
}

function zeroFill(n) {
    if ((n + '').length == 1)
        return '0' + n;

    return n;
}

function formatDate(d) {
    if (hasTime(d)) {
        var s = (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
        s += ' ' + d.getHours() + ':' + zeroFill(d.getMinutes()) + ':' + zeroFill(d.getSeconds());
    } else {
        var s = (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
    }

    return s;
}

6)すべてをまとめる:

function parseDate(s) {
    var d;
    if (looksLikeMSDate(s))
        d = parseMSDate(s);
    else if (looksLikeIsoDate(s))
        d = parseIsoDate(s);
    else
        return null;

    return formatDate(d);
}

以下の古い回答は、この日付フォーマットをjQuery独自のJSON解析に結び付けて文字列ではなくDateオブジェクトを取得する場合や、何らかの方法でjQuery <1.5のままになっている場合に役立ちます。

古い答え

ASP.NET MVCでjQuery 1.4のAjax関数を使用している場合は、すべてのDateTimeプロパティをDateオブジェクトに変換できます。

// Once
jQuery.parseJSON = function(d) {return eval('(' + d + ')');};

$.ajax({
    ...
    dataFilter: function(d) {
        return d.replace(/"\\\/(Date\(-?\d+\))\\\/"/g, 'new $1');
    },
    ...
});

jQuery 1.5 parseJSONでは、Ajax呼び出しでconvertersオプションを使用することにより、メソッドをグローバルにオーバーライドすることを回避できます。

http://api.jquery.com/jQuery.ajax/

残念ながら、日付をグローバルに解析するには、古いevalルートに切り替える必要があります。それ以外の場合は、解析後にケースバイケースで変換する必要があります。


27

JSONには組み込みの日付タイプはありません。これは、あるエポックからの秒数/ミリ秒数のように見えます。エポックがわかっている場合は、適切な時間を追加して日付を作成できます。


JSONはタイムゾーン情報が追加されたJavaScriptの日付を使用します。エポックはjavascriptのDateクラスのエポックと同じです(明らかな理由により)。
BrainSlugs83 2012

3
@ BrainSlug83-この回答は、JSONに日付タイプが組み込まれていないというアサーションのリファレンスを提供します。同意しない場合は、別のリファレンスを提供してください。(あなたは日付を表すために文字列フォーマットを決定した特定のフレームワークを考えていませんか?それはJSON標準の一部ではありません、実際にそれはそうではありません日付として解釈されることになっていますが、たまたま日付パターンに一致する文字のセットがあります。)
nnnnnn

25

また、この問題の解決策を探す必要があり、最終的にはこの日付形式やその他の多くを解析できる素晴らしいライブラリであるmoment.jsに出くわしました。

var d = moment(yourdatestring)

それは私にとっていくつかの頭痛を救ったので、私はあなたとそれを共有したいと思いました。:)
あなたはそれについてここでいくつかのより多くの情報を見つけることができます:http//momentjs.com/


24

オブジェクトをインラインスクリプトに書き込むときに、Microsoftシリアライザによって生成された文字を取り除くために、「文字をPanosの正規表現に追加しました。

したがって、C#コードビハインドにプロパティがある場合は、次のようになります。

protected string JsonObject { get { return jsSerialiser.Serialize(_myObject); }}

そしてあなたのaspxではあなたが持っています

<script type="text/javascript">
    var myObject = '<%= JsonObject %>';
</script>

あなたは次のようなものを得るでしょう

var myObject = '{"StartDate":"\/Date(1255131630400)\/"}';

二重引用符に注意してください。

これをevalが正しく逆シリアル化する形式にするために、私は次を使用しました:

myObject = myObject.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');

私はプロトタイプを使用し、それを使用するために追加しました

String.prototype.evalJSONWithDates = function() {
    var jsonWithDates = this.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');
    return jsonWithDates.evalJSON(true);
}

22

jQuery 1.5では、古いブラウザーをカバーするjson2.jsがある限り、次のようにAjaxからのすべての日付を逆シリアル化できます。

(function () {
    var DATE_START = "/Date(";
    var DATE_START_LENGTH = DATE_START.length;

    function isDateString(x) {
        return typeof x === "string" && x.startsWith(DATE_START);
    }

    function deserializeDateString(dateString) {
        var dateOffsetByLocalTime = new Date(parseInt(dateString.substr(DATE_START_LENGTH)));
        var utcDate = new Date(dateOffsetByLocalTime.getTime() - dateOffsetByLocalTime.getTimezoneOffset() * 60 * 1000);
        return utcDate;
    }

    function convertJSONDates(key, value) {
      if (isDateString(value)) {
        return deserializeDateString(value);
      }
      return value;
    }

    window.jQuery.ajaxSetup({
      converters: {
        "text json": function(data) {
          return window.JSON.parse(data, convertJSONDates);
        }
      }
    });
}());

サーバーからすべての日付をUTCとして送信することを前提とするロジックを含めました(これは必要です)。次にコンシューマーは、Dateこれを反映する適切なティック値を持つJavaScript オブジェクトを取得します。つまりgetUTCHours()、日付などにを呼び出すgetHours()と、サーバーと同じ値が返され、ブラウザで決定されたユーザーのローカルタイムゾーンの値が返されます。

これは、タイムゾーンオフセットを含むWCF形式を考慮に入れていませんが、比較的簡単に追加できます。


ちょうどメモとして:コードを機能させるには、文字列型のstartsWithメソッドを作成する必要があります
Hugo Zapata

21

jQuery UIの日付ピッカーの使用-すでにjQuery UIを含めている場合にのみ意味があります。

$.datepicker.formatDate('MM d, yy', new Date(parseInt('/Date(1224043200000)/'.substr(6)))); 

出力:

2008年10月15日


20

これを考えすぎないでください。何十年にもわたって行ったように、1970年1月1日のGMT / UTC /&cの事実上の標準エポックからの数値オフセットを、このエポックからの秒数(またはミリ秒)で渡します。JavaScriptはそれを好み、Javaはそれを好み、Cはそれを好み、インターネットはそれを好みます。


2
そして、残念ながら20を超えるエポックから選択できます。en.wikipedia.org/wiki/Epoch_(reference_date)
Jerther


18

これらすべての答えには、1つの共通点があります。日付はすべて単一の値(通常は文字列)として格納されます。

別のオプションは、JSONの固有の構造を利用して、日付を数値のリストとして表すことです。

{ "name":"Nick",
  "birthdate":[1968,6,9] }

もちろん、会話の両端が形式(年、月、日)に同意していること、およびどのフィールドが日付であることを確認していることを確認する必要がありますが、日付の問題を完全に回避できるという利点があります。から文字列への変換。それはすべて数字です-文字列はまったくありません。また、年、月、日の順序を使用すると、日付で適切にソートすることもできます。

ここでボックスの外側で考えるだけです。JSONの日付を文字列として保存する必要はありません。

この方法でこれを行うもう1つの利点は、この方法を活用することで、特定の年または月のすべてのレコードを簡単に(かつ効率的に)選択できることです。 CouchDBが配列値のクエリを処理です。


そこ RFC 3339形式であるJSONの日付の標準形式は、。
gnasher729 2016年

@gnasher、それはいいでしょうが、そうではありません。RFC 7159から3339またはその逆への参照はありません。明確な標準のJSON日付形式はありません。残っているのは事実上の標準であり、それぞれに賛否両論があります。それが標準のいいところです。
Marc L.

17

素晴らしいスレッドで投稿:

var d = new Date(parseInt('/Date(1224043200000)/'.slice(6, -2)));
alert('' + (1 + d.getMonth()) + '/' + d.getDate() + '/' + d.getFullYear().toString().slice(-2));

1
いい考えですが、タイムゾーンオフセットが含まれているとどうなりますか?その場合は、slice(6、-2)の代わりにsubstr(6)を使用することをお勧めします-以下の私の回答を参照してください。
ロイティンカー

17

ここに別のアプローチを追加するだけで、WCFが取る「ティックスアプローチ」は、ここで説明されているように非常に注意していない場合、タイムゾーンに関する問題が発生しやすいや他の場所で。そこで、.NETとJavaScriptの両方がタイムゾーンオフセットを含む正式にサポートしているISO 8601形式を使用しています。以下は詳細です:

WCF / .NETの場合:

ここで、CreationDateはSystem.DateTimeです。ToString( "o")は、ISO 8601準拠の日付文字列を生成する.NETの往復フォーマット指定子を使用しています

new MyInfo {
    CreationDate = r.CreationDate.ToString("o"),
};

JavaScriptで

JSONを取得した直後に、ISO 8601日付文字列を受け入れるDateコンストラクターを使用して、日付をJavaSript Dateオブジェクトに修正します...

$.getJSON(
    "MyRestService.svc/myinfo",
    function (data) {
        $.each(data.myinfos, function (r) {
            this.CreatedOn = new Date(this.CreationDate);
        });
        // Now each myinfo object in the myinfos collection has a CreatedOn field that is a real JavaScript date (with timezone intact).
       alert(data.myinfos[0].CreationDate.toLocaleString());
    }
)

JavaScriptの日付を取得したらtoDateStringtoLocaleStringなどの便利で信頼性の高いすべてのDateメソッドを使用できます。


16
var newDate = dateFormat(jsonDate, "mm/dd/yyyy"); 

jQueryライブラリを使用しない別のオプションはありますか?


これは新しい質問であり、ここに埋め込むのではなく、独自の質問として質問する必要があります。
スペンサーサリバン

11

これも役立ちます。

 function ToJavaScriptDate(value) { //To Parse Date from the Returned Parsed Date
        var pattern = /Date\(([^)]+)\)/;
        var results = pattern.exec(value);
        var dt = new Date(parseFloat(results[1]));
        return (dt.getMonth() + 1) + "/" + dt.getDate() + "/" + dt.getFullYear();
    }

10

以下は、JSON日付を解析するための非常に単純なソリューションです。要件に応じて、以下の関数を使用します。以下の関数にパラメーターとしてフェッチされたJSON形式の日付を渡すだけです。

function JSONDate(dateStr) {
    var m, day;
    jsonDate = dateStr;
    var d = new Date(parseInt(jsonDate.substr(6)));
    m = d.getMonth() + 1;
    if (m < 10)
        m = '0' + m
    if (d.getDate() < 10)
        day = '0' + d.getDate()
    else
        day = d.getDate();
    return (m + '/' + day + '/' + d.getFullYear())
}

function JSONDateWithTime(dateStr) {
    jsonDate = dateStr;
    var d = new Date(parseInt(jsonDate.substr(6)));
    var m, day;
    m = d.getMonth() + 1;
    if (m < 10)
        m = '0' + m
    if (d.getDate() < 10)
        day = '0' + d.getDate()
    else
        day = d.getDate();
    var formattedDate = m + "/" + day + "/" + d.getFullYear();
    var hours = (d.getHours() < 10) ? "0" + d.getHours() : d.getHours();
    var minutes = (d.getMinutes() < 10) ? "0" + d.getMinutes() : d.getMinutes();
    var formattedTime = hours + ":" + minutes + ":" + d.getSeconds();
    formattedDate = formattedDate + " " + formattedTime;
    return formattedDate;
}

10

JavaScriptライブラリmoment.jsを使用することもできます。これは、さまざまなローカライズされたフォーマットを処理し、日付の値を使用して他の操作を実行する場合に便利です。

function getMismatch(id) {
    $.getJSON("Main.aspx?Callback=GetMismatch",
    { MismatchId: id },

    function (result) {
        $("#AuthMerchId").text(result.AuthorizationMerchantId);
        $("#SttlMerchId").text(result.SettlementMerchantId);
        $("#CreateDate").text(moment(result.AppendDts).format("L"));
        $("#ExpireDate").text(moment(result.ExpiresDts).format("L"));
        $("#LastUpdate").text(moment(result.LastUpdateDts).format("L"));
        $("#LastUpdatedBy").text(result.LastUpdateNt);
        $("#ProcessIn").text(result.ProcessIn);
    }
    );
    return false;
}

ローカリゼーションのセットアップは、プロジェクトに構成ファイル(momentjs.comから入手できます)を追加して言語を構成するのと同じくらい簡単です。

moment.lang('de');

9

私はこのような日付を取得します:

"/Date(1276290000000+0300)/"

一部の例では、日付の形式が少し異なります。

"/Date(12762900000000300)/"
"Date(1276290000000-0300)"

だから私は次のRegExpを思いつきました:

/\/+Date\(([\d+]+)\)\/+/

そして最終的なコードは:

var myDate = new Date(parseInt(jsonWcfDate.replace(/\/+Date\(([\d+-]+)\)\/+/, '$1')));

それが役に立てば幸い。

更新:このリンクをマイクロソフトから見つけました: JSONを使用して日付をシリアル化するにはどうすればよいですか?

これは私たち全員が探しているもののようです。


1
正規表現の置換は遅い... substr(6)を使用して整数部分を取得し、それをparseInt()に渡す方がはるかに高速です-以下の私の回答を参照してください。
ロイティンカー、


9

日付ISO標準を確認してください。このようなもの:

yyyy.MM.ddThh:mm

になり2008.11.20T22:18ます。


JSONスキーマによると、「日時」形式はRFC 3339、セクション5.6に対応しています。したがって、GMTの日付には「yyyy-MM-ddTHH:mm:ssZ」と書くか、Zを+ hh:mmのようなタイムゾーンに置き換えます。
gnasher729 14

問題は、WCFやその他の「古い」MS JSONシリアル化がこの形式を使用しないことであり、それを考慮する必要があります。
Marc L.

9

これはイライラさせられます。私の解決策は、ASP.NETのJavaScriptSerializerによって生成された値から "/および/"を解析して、JSONに日付リテラルがなくても、ブラウザーによって日付として解釈されるようにすることでした。欲しいです:{"myDate":Date(123456789)}

DateTimeのカスタムJavaScriptConverter?

ロイ・ティンカーのコメントの正確さを強調しなければならない。これは正当なJSONではありません。JavaScriptの問題になる前に問題を取り除くのは、サーバーの汚い、汚いハックです。それはJSONパーサーを窒息させます。地面から降りるのに使ったけど、もう使わない。ただし、他の場所で言及されているように、サーバーが日付をフォーマットする方法(たとえば、ISO)を変更することが最善の答えであると私はまだ感じています。


2
それは正当なJSONではありません。Javascriptインタープリターで評価する場合にのみ機能します。しかし、JSONデコーダーを使用している場合は、窒息します。
Roy Tinker、

1
同意した。そして、私がこの1つのデータを処理しているだけなら、それは考慮しません。しかし、複数の日付やその他のプロパティのオブジェクトを扱っている場合、プロパティを1つずつ選択するよりも、全体をeval()する方が簡単です。結局のところ、根本的な問題は(正当な)JSON日付の欠如です。それが存在するまで、私たちは創造的なハックに任されています。
StarTrekRedneck 2010年

8

遅い投稿ですが、この投稿を検索した人向けです。

これを想像してみてください:

    [Authorize(Roles = "Administrator")]
    [Authorize(Roles = "Director")]
    [Authorize(Roles = "Human Resources")]
    [HttpGet]
    public ActionResult GetUserData(string UserIdGuidKey)
    {
        if (UserIdGuidKey!= null)
        {
            var guidUserId = new Guid(UserIdGuidKey);
            var memuser = Membership.GetUser(guidUserId);
            var profileuser = Profile.GetUserProfile(memuser.UserName);
            var list = new {
                              UserName = memuser.UserName,
                              Email = memuser.Email ,
                              IsApproved = memuser.IsApproved.ToString() ,
                              IsLockedOut = memuser.IsLockedOut.ToString() ,
                              LastLockoutDate = memuser.LastLockoutDate.ToString() ,
                              CreationDate = memuser.CreationDate.ToString() ,
                              LastLoginDate = memuser.LastLoginDate.ToString() ,
                              LastActivityDate = memuser.LastActivityDate.ToString() ,
                              LastPasswordChangedDate = memuser.LastPasswordChangedDate.ToString() ,
                              IsOnline = memuser.IsOnline.ToString() ,
                              FirstName = profileuser.FirstName ,
                              LastName = profileuser.LastName ,
                              NickName = profileuser.NickName ,
                              BirthDate = profileuser.BirthDate.ToString() ,
            };
            return Json(list, JsonRequestBehavior.AllowGet);
        }
        return Redirect("Index");
    }

ご覧のとおり、私はC#3.0の機能を利用して「自動」ジェネリックを作成しています。それは少し怠惰ですが、私はそれが好きで、うまくいきます。注:プロファイルは、私のWebアプリケーションプロジェクト用に作成したカスタムクラスです。


新しいロール[Authorize(Roles = "Human Resources")]を追加するたびに、コンパイルしてデプロイする必要がありますか?うわー.... :)
Alex Nolasco、

1
これがJSONサービスの場合、リダイレクトは正しくないようです。入力キーが無効で、見つからない場合は404 Not Foundを返します(また、本当に見つからない場合は404を返します)。ユーザーがログインしていない場合、403 Forbiddenを返します。
Richard Corfield

これは「再利用可能な」方法です。たとえば、別のビューからユーザーデータを取得したい場合は、IDを指定している限り取得できます。ただし、IDが指定されていない場合、ページはユーザーのリスト(インデックス)にリダイレクトされ、ユーザーを選択します。アプリに必要なシンプルなソリューション。当時の私の脳の調理方法と同じです。
レイリンダー

8

参考までに、サーバー側でPythonを使用している場合:datetime.datetime()。ctime()は、「new Date()」によってネイティブに解析可能な文字列を返します。つまり、新しいdatetime.datetimeインスタンスを作成した場合(datetime.datetime.nowなどを使用)、文字列をJSON文字列に含め、その文字列を最初の引数としてDateコンストラクターに渡すことができます。私はまだ例外を見つけていませんが、あまり厳密にテストしていません。


8

Mootoolsソリューション:

new Date(Date(result.AppendDts)).format('%x')

mootools-moreが必要です。Firefox 3.6.3およびIE 7.0.5730.13でmootools-1.2.3.1-moreを使用してテスト済み


8
var obj = eval('(' + "{Date: \/Date(1278903921551)\/}".replace(/\/Date\((\d+)\)\//gi, "new Date($1)") + ')');
var dateValue = obj["Date"];

8

ページにjQuery UIプラグインを追加します。

function DateFormate(dateConvert) {
    return $.datepicker.formatDate("dd/MM/yyyy", eval('new ' + dateConvert.slice(1, -1)));
};

8

.NETが返された場合...

return DateTime.Now.ToString("u"); //"2013-09-17 15:18:53Z"

そしてJavaScriptで...

var x = new Date("2013-09-17 15:18:53Z");
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.