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

最后,我必须提出以下问题:

  1. JavaScriptSerializer()考虑到调用,处理此问题的最佳方法是什么 .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
日期时间:http: //msdn.microsoft.com/en-us/library/system.datetime .aspx

4

2 回答 2

0

使用DateTimeOffset而不是DateTime. 看起来序列化程序将结构序列化如下:

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

这意味着该字符串可以通过服务器端的 aDateTime和字段进行反序列化。DateTimeOffset看起来这两个都将上述字符串反序列化到午夜,所以我假设反序列化器将数字解释为 +00:00 偏移量,因为它从电线上脱落。

于 2013-06-04T12:42:06.260 回答
0

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

于 2013-06-04T12:29:07.257 回答