c# JavaScriptSerializer和DateTime.跨时区的MinValue

本文关键字:时区 MinValue DateTime JavaScriptSerializer | 更新日期: 2023-09-27 18:16:47

假设我有一个客户端和一个服务器,以及一个像这样的类:

客户端:(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。january 0001 08:00:00。接下来,当我在服务器端反序列化时,它在DateTime.MinValue上看到8小时,并且if测试失败。我也不能对localtime做,因为服务器和客户端不在同一个时区,所以localtime会给我1。january 0001 04:00:00.

最后我有几个问题:

    什么是最好的方法来处理这个给定的JavaScriptSerializer()调用.ToUniversalTime()。我的目前的方法是检查0年左右的时间范围。
  1. 考虑到我们有DateTime.MinValue,难道不应该期望这个值总是准确的吗?DateTime.MinValue.ToUniversalTime()不应该等于DateTime.MinValue吗?基本上,我在问是否应该在所有转换例程中明确检查DateTime.MinValue

谢谢。

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

c# JavaScriptSerializer和DateTime.跨时区的MinValue

将它们作为字符串而不是DateTimes传递。yyyy-MM-dd hh:mm:ssZ将使其与区域性无关,并将其强制转换为UTC,这将忽略所有时区。在c# DateTime中使用的代码为u

使用DateTimeOffset代替DateTime。看起来序列化器像这样序列化结构:

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

这意味着该字符串可以被服务器端的DateTimeDateTimeOffset字段反序列化。看起来它们都将上面的字符串反序列化为午夜,所以我假设反序列化器将数字解释为+00:00的偏移量,因为它从线上出来。