4

ASP.NET アプリケーションでホストされている Ajax Web サービスがあります。このサービスは、この質問の目的のために、DateTime パラメーターを受け取ります。これは、ブラジル時間で 2013 年 2 月 1 日午前 9:00/Date(1359727200000-0200)/の MS-JSON リテラルである に相当する DateTime を受け取る必要があります。このリテラルは、ブラウザーが Ajax リクエスト内で送信するものです。

ただし、その日時を受け取る代わりに、サービス メソッドに渡される引数は Feb 1, 2013 12:00 PMです。さらに悪いことに、引数の DateTimeKind はLocalです。だったとしても理解できますがUtc、2 月 1 日はブラジル東部の夏時間であり、9:00 AM (現地時間) は 11:00 AM (UTC) になるため、それでも正しくありません。それは本当に混乱です。ちなみに、Web サーバーはブラジル東部のタイム ゾーンで実行されます。

この問題を回避するための ASP.NET 構成、サービス メソッドの注釈、特定のクライアントの指示、またはフレームワーク リソースはありますか?

4

1 に答える 1

2

多くのデバッグの後、私は問題を発見しました.JSONシリアライザーがサーバーとブラウザーの間で日付を前後に(逆)シリアル化するときのSystem.DateTime種類とリテラルに関して動作する方法を知りませんでした。Date

詳細は、次のとおりです。サービスが DateTime 値を JSON 形式でクライアントに返す必要があるとします。はDataContractJsonSerializer(悪名高い) /Date(UTC ticks)/形式の文字列を生成し、クライアントはこれを JavaScript の Date 値に解析できます。このシリアル化は、DateTime の Kind プロパティに影響されます。

  • Kind が のDateTimeKind.Utc場合、文字列リテラルには "/Date(UTC ticks)/" が含まれ、タイム ゾーンは含まれません。
  • Kind が のDateTimeKind.Local場合、文字列リテラルには "/Date(UTC ticks-time zone)/" が含まれます。
  • Kind が の場合、DateTimeKind.Unspecifiedと見なされLocalます。

逆に、クライアントがサービスに日付値を送信する場合、シリアル化プロセスは JSON リテラルの「種類」にも影響されます。

  • リテラルが "/Date(UTC ticks)/" の形式でタイム ゾーンがない場合、生成される DateTime はDateTimeKind.Utc親切なものになります。
  • リテラルが「/Date(UTC ticks-time zone)/」の形式の場合、生成される DateTime はDateTimeKind.Local親切なものになります。

私がしなければならなかったことは、クライアントが UTC 形式の日付リテラルのみをサービスに送信することを確認することだけでした。今はすべてが素晴らしいです。

于 2013-03-15T21:31:18.447 に答える