1

次の日時が SQL Server 2005 データベースに保存されています: 2012-12-06 16:20:11.010.

クライアント側で JavaScript を使用してこの日時を表示したいのでSystem.Web.Helpers.Json.Encode、次のコードを実行するを使用して (より大きなオブジェクトの一部として) シリアル化します。

internal static readonly long DatetimeMinTimeTicks = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).Ticks;

private static void SerializeDateTime(DateTime datetime, StringBuilder sb, JavaScriptSerializer.SerializationFormat serializationFormat)
{
    if (serializationFormat == JavaScriptSerializer.SerializationFormat.JSON)
    {
        sb.Append("\"\\/Date(");
        sb.Append((datetime.ToUniversalTime().Ticks - JavaScriptSerializer.DatetimeMinTimeTicks) / 10000L);
        sb.Append(")\\/\"");
        return;
    }
    sb.Append("new Date(");
    sb.Append((datetime.ToUniversalTime().Ticks - JavaScriptSerializer.DatetimeMinTimeTicks) / 10000L);
    sb.Append(")");
}

クライアント側では、次のように日時オブジェクトに変換します: ( JSFiddle )

var strDate = "/Date(1354828811010)/"; //value returned by above function
var re = /-?\d+/;
var m = re.exec(strDate);            
var date = new Date(parseInt(m[0]));

タイムゾーンが東部標準に設定されている PC では、この時刻は として正しく表示されThu Dec 06 2012 16:20:11 GMT-0500 (Eastern Standard Time)ます。ただし、タイムゾーンが GMT-6 の PC では、 として返されThu Dec 06 2012 15:20:11 GMT-0600 (Central Standard Time)ます。

今回は として正しいThu Dec 06 2012 16:20:11 GMT-0600 (Central Standard Time)ですが、正しく表示する方法がわかりません。タイムゾーンを実際に表示する必要はありません。ユーザーのローカル タイムゾーン設定に関係なく、16:20:11 と表示されるだけで十分です。

日付を特定のタイムゾーンに強制するためのJavaScriptのメカニズムはありますか? 私が行った調査では、そうではないことが示唆されています。

それ以外の場合、サーバー側を変更する必要がある場合、最善の策は何ですか?

4

3 に答える 3

2

あなたが探しているものは、Moment.js issue 611で説明されているものに関連していると思います。もしそうなら、この問題にあなたのフィードバックを追加していただけますか? それは確かに私にとってショーストッパーです。

ところで - 私は DateJS と XDate も調べましたが、私が知る限り、この機能を持っているものはありません。JavaScript は、UTC またはブラウザーのローカル タイムゾーンでロックされているようです。

また、Moment.js は発行する Microsoft の日付形式を既に処理しているJavaScriptSerializerため、直接使用することができます。ただし、代わりにJSON.Netを使用することを強くお勧めします。マイクロソフトでさえ、現在これを使用しています。デフォルトでは、ISO 形式で日付が返されます。

于 2013-04-23T03:16:42.377 に答える
1

Moments.jsを見てください。これは、日付/時刻の要件に役立つ多数の JavaScript 日付ライブラリの 1 つです。

他にはdatejsXdateが含まれます

于 2013-04-22T12:40:49.407 に答える
0

DateTime.ToUniversalTime() はシリアル化された値にタイムゾーンを含め、javascript がそれを読み取ります。それが発生したくない場合は、タイムゾーンでシリアル化しないでください。DateTime.toString() メソッドを使用して、次のような単純な書式文字列を指定します。

datetime.toString("o");

次のようなものを出力します

2008-06-15T21:15:07.0000000
于 2013-04-22T12:49:47.357 に答える