jquery - json null date format




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

私はjQueryを使ってAjaxでの最初のクラックをとっています。 自分のページにデータを取得していますが、Dateデータ型のJSONデータに問題があります。 基本的に、私はこのような文字列を取得しています:

/Date(1224043200000)/

誰かがJSONを初めて使い慣れたから - これを短い日付形式にするにはどうすればいいですか? これはjQueryコードのどこかで処理する必要がありますか? 私は何も成功せずに$.datepicker.formatDate()を使ってjQuery.UI.datepickerプラグインを試しました。

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

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

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


更新しました

私たちは、MicrosoftのASP.NET組み込みのJSON形式/Date(msecs)/など/Date(msecs)/ 、本来はここで尋ねられたJSONの日付形式(JSON.NETを含む/Date(msecs)/両方に対応しなければならない内部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日付またはISO日付を常に3ミリ秒の場所に変更していることを確認する方法があります( 上記を参照 )ので、コードは環境によって異なります。

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オブジェクトを取得したり、何とか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では、Ajax呼び出しでコンバータオプションを使用してparseJSONメソッドをグローバルにオーバーライドすることを避けることができます。

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

残念ながら、日付をグローバルに解析するには、古い評価ルートに切り替える必要があります。そうでなければ、ケースバイケースで変換する必要があります。



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

yyyy.MM.ddThh:mm

2008 2008.11.20T22:18になります。


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


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として送信することを前提としたロジックを含んでいます(これはすべきです)。 コンシューマはこれを反映する適切なティック値を持つJavaScript Dateオブジェクトを取得します。 つまり、日付のgetHours()などを呼び出すと、サーバーでの値と同じ値が返され、 getHours()を呼び出すと、ブラウザで指定されたユーザーのローカルタイムゾーンの値が返されます。

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


jQuery UIのdatePickerを使用すると、すでにjQuery UIが含まれている場合にのみ意味があります。

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

出力:

2008年10月15日


あなたがJavaScriptで言うならば、

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

正しい日付であることがわかりますし、JavaScriptコード内の任意のフレームワークでどこでも使用できます。


あなたのページにjQuery UIプラグインを追加してください:

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

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

DateTimeのカスタムJavaScriptConverter?

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


これらの回答の誰もが共通して1つのことを持っています。それらはすべて日付を単一の値(通常は文字列)として格納します。

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

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

もちろん、会話の両端が形式(年、月、日)で一致し、どのフィールドが日付であることを確認する必要がありますが、日付の問題を完全に回避するという利点がありますストリング変換。 それはすべて数字です - 文字列はまったくありません。 また、order:year、month、dayを使用すると、日付による適切なソートが可能になります。

JSONの日付を文字列として保存する必要はありません。

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


これを過度に考えないでください。 数十年前と同じように、1970年1月1日午前0時GMT / UTC /&cの事実上の標準時代からの数値オフセットを、この時代からの秒数(またはミリ秒)で渡します。 JavaScriptが好き、Javaが好き、Cが好きだし、インターネットが好きだ。


すばらしいスレッドでの投稿:

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

エバールは必要ありません。 これは正常に動作します:

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

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

編集:私は意図的に基数(parseIntに2番目の引数)を残しました。 私のコメントをください。 また、私はRory氏のコメントに完全に同意します。ISO-8601の日付がこの古い形式より優先されるため、この形式は一般的に新しい開発には使用しないでください。 ISO-8601形式を使用して日付をシリアライズする優れたJson.NETについては、優れたJson.NETライブラリを参照してください。

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

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

以下は、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;
}

別のアプローチを追加するだけで、 hereや他の場所で説明されてhereように非常に注意を払わなければ、 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の日付をtoDateStringtoDateStringtoLocaleStringなどの便利で信頼できるDateメソッドをすべて使用できます。


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

だから、C# code-behindのようなものがあれば

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

私もこの問題の解決法を探さなければなりませんでした。そして、結局私はこのdate formatとそれ以上のものを解析できる素敵なライブラリであるmoment.jsに出くわしました。

var d = moment(yourdatestring)

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


遅い投稿ですが、この投稿を検索したユーザーのためです。

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

    [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の "Auto"ジェネリックの作成機能を利用しています。 少し怠惰ですが、私はそれが好きで、うまくいきます。 ちょっとメモ:プロフィールは私のWebアプリケーションプロジェクトのために作成したカスタムクラスです。


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


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

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





json