1

クライアントとサーバーがあり、次のようなクラスがあるとします。

クライアント側: (タイムゾーン: UTC -8)

class Foo {
      public int a;
      public DateTime MyTime { get; set; }
    }

var serialized = new JavaScriptSerializer().Serialize(new Foo { a = 1 });
// Send serialized to server

サーバー側: (タイムゾーン UTC-4)

// Receive JSON
var deserialized = new JavaScriptSerializer().Deserialize<Foo>(serialized);
if (deserialized.MyTime == DateTime.MinValue) {
  // dostuff
}

ここでの私の問題はJavaScriptSerializer.Serialize(foo)1. january 0001 08:00:00MyTime.MinValue.ToUniversalTime()が得られることです。次に、サーバー側でデシリアライズすると、8 時間が経過し、if テストが失敗します。サーバーとクライアントが同じタイムゾーンにないため、ローカルタイムにもできません。したがって、ローカルタイムは1. january 0001 04:00:00 になります。DateTime.MinValue

この最後に、私は質問する必要があります:

  1. JavaScriptSerializer()callを行う場合、これを処理する最良の方法は何ですか .ToUniversalTime()。私の現在のアプローチは、0年前後の時間範囲をチェックすることです。
  2. を持っていることを考えるとDateTime.MinValue、この値が常に正確であると期待すべきではありません。DateTime.MinValue.ToUniversalTime()に等しいべきではありませんDateTime.MinValueか? DateTime.MinValue基本的に、すべての変換ルーチンで探している明示的な if チェックが必要かどうかを尋ねています。

ありがとう。

JavaScriptSerializer: http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx
DateTime: http://msdn.microsoft.com/en-us/library/system.datetime .aspx

4

2 に答える 2

0

DateTimeOffsetの代わりに使用しDateTimeます。シリアライザーは次のように構造体をシリアライズするようです。

{"a":1,"MyTime":"\/Date(-62135596800000)\/"}

これは、この文字列がサーバー側のフィールドDateTimeとフィールドのいずれかによって逆シリアル化できることを意味します。DateTimeOffsetどちらも上記の文字列を真夜中にデシリアライズしているように見えるので、デシリアライザーは数値がネットワークから外れると +00:00 オフセットとして解釈すると想定しています。

于 2013-06-04T12:42:06.260 に答える
0

DateTimes の代わりに文字列として渡すだけです。yyyy-MM-dd hh:mm:ssZカルチャ ニュートラルにし、すべてのタイム ゾーンを無視する UTC にキャストします。これは C# DateTimeで code として使用されますu

于 2013-06-04T12:29:07.257 に答える