C# 从JavaScriptSerializer.Serialize到ToLocalTime的DateTime的夏令时问题
目前,在夏时制实施后,我观察到一个问题,即如果我选择C# 从JavaScriptSerializer.Serialize到ToLocalTime的DateTime的夏令时问题,c#,datetime,dst,javascriptserializer,C#,Datetime,Dst,Javascriptserializer,目前,在夏时制实施后,我观察到一个问题,即如果我选择 DateTime startDate=new DateTime(2012,1,20); //Eastern Timezone (UTC -5:00) 序列化后,它将转换为: string serializeDate= serializer.Serialize(startDate); //In ticks 20-Jan 2012 05:00AM 关于反序列化和ToLocalTime() DateTime afterDeserialize=
DateTime startDate=new DateTime(2012,1,20); //Eastern Timezone (UTC -5:00)
序列化后,它将转换为:
string serializeDate= serializer.Serialize(startDate); //In ticks 20-Jan 2012 05:00AM
关于反序列化和ToLocalTime()
DateTime afterDeserialize=serializer.Deserialize(serializeDate);
反序列化后。ToLocalTime();
它一直工作得很好,直到:
我取消选中了自动调整夏令时时钟的
现在它的序列化添加了4:00小时
(由于夏令时),但是在ToLocalTime()
减去-5:00小时
,因为环境夏令时更改了我的对象减去一天的日期
如何在两种转换上注入当前环境夏令时 您需要存储时区的偏移量,然后在转换后重新应用它
要使其动态(如您在评论中所述),您可以首先获取当前时区:
TimeZoneInfo tzi = TimeZoneInfo.Local;
TimeSpan offset = tzi.GetUtcOffset(myDateTime);
然后做:
DateTime startDate=new DateTime(2012,1,20).Add(offset);
然后在序列化之后:
DateTime afterDeserialize= serializer.Deserialize<DateTime>(serializeDate);
afterDeserialize.ToLocalTime().AddOffset(offset);
DateTime afterDeserialize=serializer.Deserialize(serializeDate);
反序列化后.ToLocalTime().AddOffset(offset);
当您解开该框时,startTime
中的时间值是多少?(在序列化之前)。在这两种情况下,都是2012年1月20日00:00很好!!!但是如何使FindSystemTimeZoneById()动态。表示它自动为系统选择时区信息。@ZaheerAhmed检查我的编辑,我将其更改为使用CurrentTimeZone
属性。我更新了您的代码。StandardName
和Id
不是一回事。(Id
是不变的,StandardName
用于显示,可以本地化)。而且不需要查找它-它总是在TimeZoneInfo.Local
@MattJohnson中,谢谢:)
DateTime afterDeserialize= serializer.Deserialize<DateTime>(serializeDate);
afterDeserialize.ToLocalTime().AddOffset(offset);