Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从JavaScriptSerializer.Serialize到ToLocalTime的DateTime的夏令时问题_C#_Datetime_Dst_Javascriptserializer - Fatal编程技术网

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);