3

JSON で日付を処理する方法の問題は、ASP.NET AJAX Web サービスとページ メソッドを直接呼び出すときに発生する可能性のある厄介な問題の 1 つです。言語の他のすべてのデータ型とは異なり、JavaScript には Date を表現するための宣言的な方法がありません。したがって、それらを JSON 内に埋め込むには、少し手の込んだフットワークが必要です。

JSON の日付に関する正確な問題を説明しようと思います。

どうしたの?

根本的な問題は、JavaScript が Date オブジェクトを宣言的に表現する方法を提供しないことです。これが Date リテラル (の欠如) として説明されているのを見たことがあるかもしれません。リテラルとは 説明のために、これらは他のいくつかのデータ型のリテラルです。

// String
'foo';

// Number
3.14;

// Boolean
true;

// Array
[1, 2, 3, 5, 7];

// Object
{ pi: 3.14, phi: 1.62 };

残念ながら、日付に関して言えば、リテラルがないということは、リテラルを作成する唯一の方法は Date オブジェクトを明示的に初期化することです。

// Correct.
new Date('4/26/09');

// Correct (the month is 0 indexed, hence the 3).
new Date(2009, 3, 26);

// Incorrect. This is a string, not a Date.
'4/26/09';

クライアント側の JavaScript コードを記述する場合、この制限は問題ありませんが、JSON オブジェクト内で日付を送信する適切な方法がなくなります。日付リテラルの欠如は問題です。誰かが解決策を提案できますか。

4

3 に答える 3

1

私は最近、この種のことについてのブログ投稿をここに書きました...それは地雷原です!職場では、ここにあるW3C形式のバリエーションを使用して、MVC3サービスからDateTimesとDateTimeOffsetsを文字列として送信することにしました。DateTimeの場合はYYYY-MM-DDThh:mm:ssを使用し、DateTimeOffsetsの場合はYYYY-MM-DDThh:mm:ss + TZDを使用します(これらの形式指定子は.NETではなくW3Cです)。

しかし、この質問への答えは、実際には日付で何をしたいかによって異なります。別の返信が示唆しているように、エンドユーザーに表示するだけであれば、人間が読める形式の文字列をネットワーク経由で送信するだけで解決できる可能性があります。

于 2012-04-06T08:49:39.123 に答える
1

まず、DateTime をクライアント側に送信する理由を検討してください。ほとんどの場合、文字列表現を表示していて、適切な JavaScript Date オブジェクトは必要ありません。さらに、最終的に JavaScript の Date オブジェクトになった場合は、追加のコードまたは JavaScript ライブラリを使用して、ユーザー フレンドリーな形式で表示することになるでしょう。巧妙な回避策に感謝しますが、問題を完全に回避したいと思います。クライアント側で JavaScript の Date オブジェクトをインスタンス化してから書式設定するために、これらすべての面倒な手順を踏むのではなく、単純に書式設定された文字列を返すことをお勧めします。例えば、

[System.Web.Script.Services.ScriptService]
public class DateService : System.Web.Services.WebService
{
[WebMethod]
public string GetDate()
{
return new DateTime(2009, 4, 26).ToLongDateString();
}
}

ここで、サービスを呼び出すと、次の JSON が返されます。

{"d":"Sunday, April 26, 2009"}

もう正規表現はありません。JavaScript の Date オブジェクトはもうありません。クライアント側でのデータのフォーマットについて心配する必要はもうありません。さらに良いことに、機能が失われることはありません。Dates をインスタンス化する必要がある場合は、まだ可能です。

于 2012-04-06T08:30:05.527 に答える