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.
最后我有几个问题:
- 什么是最好的方法来处理这个给定的
- 考虑到我们有
DateTime.MinValue
,难道不应该期望这个值总是准确的吗?DateTime.MinValue.ToUniversalTime()
不应该等于DateTime.MinValue
吗?基本上,我在问是否应该在所有转换例程中明确检查DateTime.MinValue
。
JavaScriptSerializer()
调用.ToUniversalTime()
。我的目前的方法是检查0年左右的时间范围。谢谢。
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
将它们作为字符串而不是DateTimes传递。yyyy-MM-dd hh:mm:ssZ
将使其与区域性无关,并将其强制转换为UTC,这将忽略所有时区。在c# DateTime中使用的代码为u
。
使用DateTimeOffset
代替DateTime
。看起来序列化器像这样序列化结构:
{"a":1,"MyTime":"'/Date(-62135596800000)'/"}
这意味着该字符串可以被服务器端的DateTime
和DateTimeOffset
字段反序列化。看起来它们都将上面的字符串反序列化为午夜,所以我假设反序列化器将数字解释为+00:00的偏移量,因为它从线上出来。