C#JavaScriptSerializer和DateTime.MinValue交叉时区

时间:2013-06-04 12:18:55

标签: c# json javascriptserializer

鉴于我有一个客户端和服务器,以及这样的类:

客户端:(TimeZone: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

服务器端:( TimeZone UTC-4)

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

我的问题是JavaScriptSerializer.Serialize(foo)MyTime.MinValue.ToUniversalTime()给了我 1。 1月0001 08:00:00 。接下来,当我在服务器端进行反序列化时,它会在DateTime.MinValue上看到8小时,并且if测试失败。我也不能做本地时间,因为服务器和客户端不在同一时区,所以本地时间会给我 1。 1月0001 04:00:00

最后我要提问:

  1. 这样做的最佳方法是什么? JavaScriptSerializer()拨打电话.ToUniversalTime()。我的 目前的做法是检查第0年左右的时间范围。
  2. 鉴于我们有DateTime.MinValue,如果不期望这个值总是如此。 DateTime.MinValue.ToUniversalTime()不应该等于DateTime.MinValue吗?基本上我在询问是否应该明确检查是否在所有转换例程中查找DateTime.MinValue
  3. 感谢。

    JavaScriptSerializer: http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx
    约会时间: http://msdn.microsoft.com/en-us/library/system.datetime.aspx

2 个答案:

答案 0 :(得分:0)

只需将它们作为字符串而不是DateTimes传递。 yyyy-MM-dd hh:mm:ssZ将使其文化中立并将其转换为UTC,这将忽略所有时区。这在C#DateTime中用作代码u

答案 1 :(得分:0)

使用DateTimeOffset代替DateTime。它看起来像序列化程序序列化结构如下:

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

这意味着可以通过服务器端的DateTimeDateTimeOffset字段对此字符串进行反序列化。看起来这两个都将上面的字符串反序列化为午夜,所以我假设反序列化器将数字解释为+00:00偏移量,因为它从线路中脱离。