2012-04-06 14 views
3

JSONで日付を処理する方法の問題は、ASP.NET AJAX Webサービスとページメソッドを直接呼び出すときに発生する可能性のある面倒な問題の1つです。 言語の他のすべてのデータ型とは異なり、JavaScriptは日付を表すための宣言的方法を提供しません。そのため、JSON内に埋め込むにはちょっとしたフットワークが必要です。ASP.NET AJAXによって返された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 }; 

、それが日付になると、リテラルの欠如が1を作成するための唯一の方法は、明示的に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オブジェクト内で日付を送信する良い方法はありません。 日付リテラルの欠如が問題です。誰かが解決策を提案できますか?

+2

あなたは、UNIXタイムスタンプ、長い整数として日付を保存して送信することができます。ほとんどの言語とプラットフォームは、UNIXのタイムスタンプを解釈して変換できます。 –

答えて

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をインスタンス化する必要がある場合は、それでも可能です。

+0

はテスト済みで、私とは連携していません。あなたはそれをテストしていますか? – Aristos

+1

私はそれをテストしました。 – Unknown

+0

日付を使用して日付に変換すると、そのまま文字列になり続けます。 – Aristos

0

私は2つの方法、1つはDate.UTC()、もう1つはTicksにすることです。どちらも機能します。

結果は{dt : 28839281}

とどのように私はそれが

public static string ToJsonDate(DateTime value) 
{ 
    return string.Format("Date.UTC({0}, {1}, {2})", value.Year, value.Month-1, value.Day); 
} 

結果は​​

ようになるの日付に変換するようになります

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

  public static long cOnlyDate(long Ticks) 
  { 
    return (864000000000 * (Ticks/864000000000)); 
  } 

    public static long ToJsonTicks(DateTime value) 
    { 
    return (cOnlyDate(value.ToUniversalTime().Ticks) - UnixEpochTicks)/10000; 
    } 

JSONダニに変換機能

ps、私は今、Unknowのソリューションをテストし、自分のコードでは動作しません。

1

私は最近、この種のことについてブログ記事を書いたhere ...それは地雷です!職場では、W3C形式のバリエーションを使用して、MVC3サービスからDateTimeとDateTimeOffsetsを文字列として送信することに決めました(here)。 MM:SS、DateTimeOffsetsため、YYYY-MM-DDTHH:mm:ssの+ TZD(これらの書式指定子は、.NET W3Cではありません)日時については、我々はYYYY-MM-DDTHHを使用しています。

しかし、この質問への答えは本当にあなたが日付に何をしたいかに依存しません。別の返答が示唆しているように、あなたがやりたいことがエンドユーザに表示されている場合は、人間が読める文字列を単に送信するだけで逃げることができます。

関連する問題