web-dev-qa-db-ja.com

Microsoft JSONの日付をフォーマットする方法

私は Ajax でjQueryを使って私の最初の亀裂を取っています。データを自分のページに取り込んでいますが、Dateデータ型に対して返されるJSONデータに問題があります。基本的に、このような文字列が返されます。

/Date(1224043200000)/

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

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

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;
}

この解決策は、コールバックメソッドから私のオブジェクトを取得し、日付フォーマットライブラリを使用してページ上に日付を正しく表示しました。

1903
Mark Struzinski

評価は必要ありません。これはうまくいきます:

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

Substr関数は "/ Date("部分を取り出し、parseInt関数は整数を取得し、末尾の ")/"を無視します。結果の数値はDateコンストラクタに渡されます。

編集:私は意図的に基数(parseIntの2番目の引数)を省略しました。 下記の私のコメントを参照してください 。また、 Roryのコメント に完全に同意します。ISO-8601の日付は、この古い形式よりも優先されます。したがって、この形式は通常、新しい開発には使用しないでください。 ISO-8601フォーマットを使用して日付をシリアル化するための優れた代替方法については、excellent Json.NET ライブラリーを参照してください。

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

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

これを使ってJSONから日付を取得することができます。

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

そして、 JavaScriptの日付フォーマット script(縮小してgzipした場合は1.2 KB)を使って好きなように表示することができます。

124
Panos

Newtonsoft Json.NET を使っている人のために、IE8での ネイティブJSON、Firefox 3.5とJson.NET を使ってそれを行う方法を読んでください。

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);
93
Jason Jong

元の例:

/Date(1224043200000)/  

組み込みのJSONシリアライゼーションを使用してWCF RESTを介して日付を送信するときにWCFで使用されるフォーマットは反映されません。 (少なくとも.NET 3.5、SP1では)

私はここで答えを見つけましたが、タイムゾーンのGMTオフセットが(1970年以来)WCF JSONで返された数値に追加されているように思われるので、正規表現に若干の編集が必要です。

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年の時間シンセ、さらにタイムゾーンのオフセットをすべてevalに入力して日付オブジェクトを取得できます。

置き換えの結果として得られるJavaScriptの行は次のとおりです。

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

繰り返してはいけません - $.parseJSON()を使って日付変換を自動化する

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

とにかく。あなたが何度も何度もあなたの日付変換コードを繰り返したくないならば、私はあなたが このブログ記事を読んだ そしてあなたの人生を少し楽にするコードを手に入れることを勧めます。

60
Robert Koritnik

JavaScriptで言うと、

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

あなたはそれが正しい日付であることを見るでしょう、そしてあなたはどんなフレームワークでJavaScriptコードのどこでもそれを使うことができます。

59
John Boker

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

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();

結果 - "10/15/2008"

55
user2007801

更新しました

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

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

1)マイクロソフトの日付フォーマットを検出する

// 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)oldIEの問題に対処しながら、標準のISO日付フォーマットを解析します。

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オブジェクトが得られます。

古い答え

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では、Ajax呼び出しでconvertersオプションを使用することでparseJSONメソッドをグローバルにオーバーライドすることを避けることができます。

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

残念ながら、Datesがグローバルにその場で解析できるようにするには、古いevalルートに切り替える必要があります。そうしないと、解析後にケースバイケースで変換する必要があります。

36
Chris Moschini

私はまた、この問題に対する解決策を探さなければなりませんでした、そして結局、私はmoment.jsに出会いました。

var d = moment(yourdatestring)

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

24
Venemo

_ json _ には組み込みの日付型はありません。これはあるエポックからの秒数/ミリ秒数のように見えます。あなたがエポックを知っているなら、あなたは正しい時間を加えることによって日付を作ることができます。

23
johnstok

インラインスクリプトにオブジェクトを書き込むときに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)');

Prototype を使って追加しました

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

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として送信すると仮定するロジックを含めました(あなたがそうするべきです)。次に、消費者はこれを反映するための適切なticks値を持つJavaScriptのDateオブジェクトを取得します。つまり、日付にgetUTCHours()などを呼び出すと、サーバーで行ったのと同じ値が返され、getHours()を呼び出すと、ブラウザによって決定されたユーザーのローカルタイムゾーンの値が返されます。

これはタイムゾーンオフセット付きの _ wcf _ フォーマットを考慮に入れていませんが、比較的簡単に追加できます。

21
Domenic

これを考え過ぎないでください。何十年もしてきたように、1970年1月1日深夜GMT/UTC /&cのデファクトスタンダードEpochからの数値オフセットを、このEpochからの秒数(またはミリ秒)で渡します。 JavaScriptがそれを好み、Javaがそれを好み、Cがそれを好み、そしてインターネットがそれを好みます。

19
Jé Queue

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

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

出力:

2008年10月15日

19
dominic

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

もう1つの選択肢は、JSONの固有の構造を利用し、日付を数値のリストとして表すことです。

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

もちろん、会話の両端(年、月、日)、およびどのフィールドを日付にすることを意図しているかについて、必ず一致させる必要があります。ただし、dateの問題を完全に回避できるという利点があります。から文字列への変換。すべて数字です - まったく文字列はありません。また、年、月、日の順序でも、日付による適切なソートが可能です。

ここでは箱の外で考えるだけです - JSONの日付は文字列として格納する必要はありません。

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

18
Nick Perkins

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

var d = new Date(parseInt('/Date(1224043200000)/'.slice(6, -2)));
alert('' + (1 + d.getMonth()) + '/' + d.getDate() + '/' + d.getFullYear().toString().slice(-2));
16
Dan Beam
var newDate = dateFormat(jsonDate, "mm/dd/yyyy"); 

JQueryライブラリを使用せずに他のオプションはありますか?

16
Bilgin Kılıç

ここで別のアプローチを追加するために、 ここ 他の場所で説明されているように特に注意を払わないと、 _ wcf _ が取る "ticks approach"が問題になりがちです。だから私は今、.NETとJavaScriptの両方がタイムゾーンオフセットを含む正式にサポートしているISO 8601フォーマットを使っています。詳細は以下のとおりです。

WCF/.NETの場合:

CreationDateはSystem.DateTime、ToString( "o")は.NETの 往復形式指定子を使用している ISO 8601に準拠した日付文字列を生成する _

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メソッドをすべて使用できます。

15
Scott Willeke

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

"/Date(1276290000000+0300)/"

いくつかの例では、日付はわずかに異なるフォーマットです:

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

等.

それで、私は以下のRegExpを思いつきました:

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

そして最後のコードは:

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

それが役に立てば幸い。

更新:私はマイクロソフトからこのリンクを見つけました: どのようにJSONで日付をシリアライズするのですか?

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

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

下記はJSONの日付をパースするためのとても簡単な方法です。あなたの条件に従って以下の機能を使用してください。以下の関数には、パラメータとして取得したJSON形式のDateを渡すだけです。

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;
}
9
Umar Malik

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');
8
martinoss

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

DateTime用のカスタムJavaScriptConverter?

Roy Tinkerのコメントの正確さを強調しなければなりません。これは合法的なJSONではありません。 JavaScriptの問題になる前に、この問題を解決するのは汚い、汚いハックです。それはJSONパーサを詰まらせるでしょう。私はそれを地面から降りるために使用しましたが、私はこれをこれ以上使用しません。しかし、私は依然として最善の解決策は、サーバーが日付をフォーマットする方法を変更することにあると感じています。

8
StarTrekRedneck

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

yyyy.MM.ddThh:mm

それは2008.11.20T22:18になります。

8
Thomas Hansen

ページに jQuery UI pluginを追加します。

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

最近の投稿ですが、この投稿を検索した人のためのものです。

想像してみてください。

    [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");
    }

お分かりのように、 "Auto" Genericsを作成するのにC#3.0の機能を利用しています。それは少し怠惰です、しかし私はそれが好きです、そしてそれは働きます。ちょっと注意してください:Profileは私が私のWebアプリケーションプロジェクトのために作成したカスタムクラスです。

7
Ray Linder

これはまたあなたを助けることができます。

 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();
    }
7
Ravi Mehta

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を使用してテスト済み

7
Midhat

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

6
Kyle Alan Hale

どうすればいい - .NET returns ...

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

そしてJavaScriptでは...

var x = new Date("2013-09-17 15:18:53Z");
6

次のコードでは。私は持っています

1. 日付文字列からタイムスタンプを取得しました。

2. それをIntにパースしました

3. 最後にそれを使ってDateを作成しました。

var dateString = "/Date(1224043200000)/";
var seconds = parseInt(dateString.replace(/\/Date\(([0-9]+)[^+]\//i, "$1"));
var date = new Date(seconds);
console.log(date);
5

ちなみに、KendoUIはMicrosoft JSONの日付の変換をサポートしています。あなたのプロジェクトが "KendoUI"への参照を持っているのであれば、あなたは単に使用することができます

var newDate = kendo.parseDate(jsonDate);
2
Safeer Hussain

これは 正規表現 を使用し、それは同様に動作します:

var date = new Date(parseInt(/^\/Date\((.*?)\)\/$/.exec(jsonDate)[1], 10));
2
Vlad Bezden

私が提案できる最も簡単な方法はJSで正規表現を使うことです:

//Only use [0] if you are sure that the string matches the pattern
//Otherwise, verify if 'match' returns something
"/Date(1512488018202)/".match(/\d+/)[0] 
2
Reuel Ribeiro

あなたが使ってみることができるもう一つの正規表現の例:

var mydate = json.date
var date = new Date(parseInt(mydate.replace(/\/Date\((-?\d+)\)\//, '$1');
mydate = date.getMonth() + 1 + '/' + date.getDate() + '/' + date.getFullYear();

date.getMonth()は整数0 - 11を返すので、正しい月数を得るには1を加えなければなりません。

2
Luminous

これを試して...

function formatJSONDate(jsonDate) {
            var date = jsonDate;
            var parsedDate = new Date(parseInt(date.toString().substring(6)));
            var newDate = new Date(parsedDate);
            var getMonth = newDate.getMonth() + 1;
            var getDay = newDate.getDay();
            var getYear = newDate.getFullYear(); 

            var standardDate = (getMonth<10 ? '0' : '') + getMonth + '/' + (getDay<10 ? '0' : '') + getDay + '/' + getYear;
            return standardDate;
        }

getYear()は1900年の年を返します。これはしばらくの間非推奨となっています。

2
Noor All Safaet

私はMicrosoft JSON Dateから日付を取得するためにこの単純な関数を使います

function getDateValue(dateVal) {
    return new Date(parseInt(dateVal.replace(/\D+/g, '')));
};

replace(/\D+/g, '')は数字以外のすべての文字を削除します

parseIntは文字列を数値に変換します

使用法

$scope.ReturnDate = getDateValue(result.JSONDateVariable)
1

JSONの日付をJavaScriptの日付に変換するのは簡単です。

var s = Response.StartDate;     
s = s.replace('/Date(', '');

s = s.replace(')/', '');

var expDate = new Date(parseInt(s));
1
user1814380

TLDR:その日付のみの値を確実に変換することはできません。代わりに文字列を送信してください...

...または少なくともそれが、これらの答えのほとんどすべてが始まるべき方法です。

ここで起こっている多くの変換問題があります。

これは時間のない日付です

誰もが見逃しているように思われるのは、疑問の末尾のゼロがいくつあるかということです - それはほぼ確実に時間のない日付として始まります:

/Date(1224043200000)/

Javascriptコンソールから新しいDateとしてこれを実行すると(多くの回答の根拠)

new Date(1224043200000)

あなたが得る:

enter image description here 

元の質問者はおそらくESTで、真夜中の純粋な日付(sql)またはDateTime(DateTimeOffsetではなく)を持っていました。

言い換えれば、ここでの意図は時間部分が無意味であるということです。ただし、ブラウザがこれを生成したサーバーと同じタイムゾーンでこれを実行する場合は問題ありません。ほとんどの回答は機能します。

タイムゾーン別ビット

しかし、別のタイムゾーン(PSTなど)を持つマシンで上記のコードを実行したとします。

enter image description here 

この別のタイムゾーンでは、現在は の後ろに があることに気付くでしょう。これはシリアライザを変更しても修正されません(ISOフォーマットのタイムゾーンも含まれます)。

問題

Date(sql)とDateTime(.net)にはタイムゾーンはありませんが、これらを変換する(この場合はjavascriptからjsonまで)とすぐに、.netのデフォルトのアクションは現在のタイムゾーンを想定します。 。

シリアライゼーションが作成している数は、UNIX Epochからのミリ秒、または次のとおりです。

(DateTimeOffset.Parse("10/15/2008 00:00:00Z") - DateTimeOffset.Parse("1/1/1970 00:00:00Z")).TotalMilliseconds;

これは、JavaScriptのnew Date()がパラメータとして使用するものです。 EpochはUTCのものなので、欲しいかどうかにかかわらず、タイムゾーン情報がそこにあります。

考えられる解決策:

シリアル化されたオブジェクトに日付のみを表す文字列プロパティを作成した方が安全な場合があります。「2008年10月15日」の文字列がこの混乱と混同されることはほとんどありません。たとえそこにあってもあなたは解析側に注意する必要があります: https://stackoverflow.com/a/31732581

しかし、尋ねられた質問に対する答えを提供するという精神の中では、

function adjustToLocalMidnight(serverMidnight){ 
  var serverOffset=-240; //injected from model? <-- DateTimeOffset.Now.Offset.TotalMinutes
  var localOffset=-(new Date()).getTimezoneOffset(); 
  return new Date(date.getTime() + (serverOffset-localOffset) * 60 * 1000)
}

var localMidnightDate = adjustToLocalMidnight(new Date(parseInt(jsonDate.substr(6))));
0
b_levitt