5

AJAX 呼び出しで値を ko.observalbeArray にプッシュしています。observableArray にプッシュする前に、JSON の戻り日付を「YYYY-MM-DD」にフォーマットしたいと考えています。

変換したいコードの特定の要素は次のとおりです。 OrderTimeStamp: element.OrderTimeStamp サーバーから返される日付の例を次に示します。

/日付(1377200468203+0200)/

これが私のAJAX呼び出しです:

        $.ajax({
        url: "/[URL TO API Method]/GetAllOrdersbyparm",
        data: {Parm: ko.toJS(MyDataViewModel.SelectedParmater), Start: ko.toJS(MyDataViewModel.ParmStart), End: ko.toJS(MyDataViewModel.ParmEnd)},
        type: "GET",
        contentType: "application/json; charset=utf-8",
        dataType: "JSON",
        timeout: 10000,
        success: function (Result) {
            for (var i = 0; i < Result.d.length; i++) {
                element = Result.d[i];
                MyDataViewModel.OrderDetails.push({ OrderID: element.OrderID, OrderGUID: element.OrderGUID, OrderTimeStamp: element.OrderTimeStamp, OrderStatus: element.OrderStatus, QtyProductsOnOrder: element.QtyProductOnOrder, PaymentDate: element.PaymentDate });
            }
        },
        error: function (xhr, status) {
            alert(status + " - " + xhr.responseText);
        }
    });
4

2 に答える 2

7

つまり、これは ASP.NET 固有の Microsoft Date "標準" です。

http://www.hanselman.com/blog/OnTheNightmareThatIsJSONDatesPlusJSONNETAndASPNETWebAPI.aspxを参照 してください 。疫病のように避けるべき理由です(1)。

その形式では、最初のコンポーネントは UNIX エポックからの UTC ミリ秒オフセットです。オフセットは TO 現地時間であり、JS Date 文字列表現のタイムゾーン オフセットとは逆です。

使用する

var dateString = myDate.toJSON();

JS Date オブジェクトを送信用にシリアル化します。

このようなシリアル化された日時文字列は、同じく UTC (別名 *Z*ulu) であり、次のように Date オブジェクトを作成するために使用できます。

var myDate = new Date(dateString);

(1) この古い ASP.NET Date 形式をサポートする必要がある場合は、次のように適切な JS Date に変換できます ([Roy Tinker][2] に感謝します)。

myDate = new Date(parseInt("/Date(1377200468203+0200)/".substr(6)));

私はその特定の日時表記に慣れていません。

それは自家栽培ですか?

そのためのドキュメントはありますか?

そうでない場合は、それを解釈しようとすると問題が発生します。

そのJSONへの変換はUTC時間になり、詳細に文書化されていない限り、いくつかのことは解釈の余地があります.

これが私の答えです。規範的な記述で上記の定義があることを確認してください。


それでは、少しとりとめのない話をさせてください。

ここでちょっとした練習をしました...

http://en.wikipedia.org/wiki/ISO_8601は、日時表記のベースとなる優れた標準です。

これで、エポック ('1970-01-01T00:00:00Z') からのミリ秒の時間値のように見える (おそらく、タイムゾーン オフセットが既に適用されている可能性があります!) HHMM のタイムゾーン オフセット文字列。

これらの 2 つのコンポーネントがうまく混ざり合わないため、これは少し怖いことです。

式 1377200468203+0200 として評価すると、8 進数が減算されます。200ミリ秒!1377200468203 から。これは明らかに意図したものではありません。

ISO8601 (この表記はそうではありません) では、このタイムゾーン オフセットは FROM UTC になるため、ミリ秒値には既に 2 時間 0 分のオフセットが適用されています。

もちろん、コードは、指定された日時とは異なるタイムゾーンにあるマシンで実行できます。

非常に重要な問題は、このミリ秒の日時値に実際にオフセット FROM UTC が含まれているかどうかです。

その場合、 var dt = new Date(1377200468203); を実行します。間違っているでしょう。

サマータイムの切り替え時刻に近い場合、そこから単に減算してオフセットするのは正しくありません。

于 2013-08-24T18:33:36.350 に答える
1

以下があなたの質問に答えるかどうかわからないことに注意してください。そうでない場合は、次の方法が役立つ場合があります: JSON 日付をフォーマットする方法は?

これらの行に沿った何かが機能するはずです:

var yyyy = element.OrderTimeStamp.getFullYear()
var mm = element.OrderTimeStamp.getMonth();
var dd = element.OrderTimeStamp.getDate();

var x = yyyy + '-' + (mm < 10 ? '0'+mm : mm) + '-' + (dd < 10 ? '0'+dd : dd)

element.OrderTimeStamp = x;

例については、このフィドルを参照してください。参考までに、MDN ページには s に関する優れたドキュメントがありDateます。

より高度な日付と時刻の機能が必要な場合は、MomentJSを参照することをお勧めします。

于 2013-08-24T17:41:25.533 に答える