我正在使用DateTime.ToLocalTime()将日期从协调世界时转换为本地时间。我的时区是GMT+1(贝尔格莱德,布达佩斯,卢比纳...),它是在Windows设置(XP)中正确设置的。
上周末在我们的时区,我们将冬季时间改为夏季时间,这意味着我们将当地时间拨回了一个小时。
在我看来,从那一刻起,ToLocalTime方法的行为就变得奇怪了。当我使用它来转换冬季时间更改后的日期时,它工作得很好,如下所示:
var utcDate2 = new DateTime(2011, 11, 2, 9, 0, 0,DateTimeKind.Utc);utcDate1.ToLocalTime()值为:2011.11.02. 10:00:00 it is
Burt当我想要转换此更改之前的日期(例如,夏季时间的日期)时,它会返回一个不好的值,如下所示:
var utcDate1 = new DateTime(2011, 10, 23, 9, 0, 0,DateTimeKind.Utc);utcDate2.ToLocalTime()值为:2011.10.23. 10:00:00不正确,应为2011.10.23。11:00:00
我应该怎么做才能获得正确的值?我应该如何使用也可以调整冬季/夏季时间的ToLocalTime?
发布于 2011-11-02 19:40:16
http://msdn.microsoft.com/en-us/library/system.datetime.tolocaltime.aspx
在Windows XP系统上,当从UTC转换为本地时间时,ToLocalTime方法仅识别当前的调整规则。因此,当前调整规则生效前的期间换算可能无法准确反映UTC和本地时间之间的差异。
因此,你必须找到另一种方法来解决这个问题。
发布于 2011-11-02 19:51:30
我的猜测是,你系统上的时区数据可能已经过时了--或者是由于jsobo提到的限制。
您可能希望(谨慎地)使用我的日期/时间应用编程接口Noda Time。它具有与DateTime之间的转换,因此您可以在代码中的其他地方使用DateTime,尽管很明显,我相信如果您始终使用Noda Time,您的代码会更清晰:)
Noda Time还没有“v1.0就绪”,但主要是因为缺少一些功能。当然,您是否愿意承担非v1.0开源项目的风险取决于您,但我很乐意帮助您解决遇到的任何问题。(我真的在努力寻找现实生活中的用例,所以如果您需要任何缺少的功能,我很可能能够在其他人需要相同功能的情况下实现它们。)
Noda Time使用的是zoneinfo时区数据库,而不是Windows内置的时区数据库,所以它应该不会有同样的问题。
为了进行检查,您可以使用如下代码:
DateTimeZone belgradeZone = DateTimeZone.ForId("Europe/Belgrade"); // Or whatever
// Alternatively...
DateTimeZone localZone = DateTimeZone.SystemDefault;
ZonedDateTime utc = new ZonedDateTime(2011, 10, 23, 9, 0, 0, DateTimeZone.Utc);
ZonedDateTime belgrade = new ZonedDateTime(utc.ToInstant(), belgradeZone);
Console.WriteLine(belgrade.LocalDateTime);发布于 2011-11-02 19:55:00
我使用相同的时区,当我尝试它时,我得到了正确的值:
var utcDate1 = new DateTime(2011, 10, 23, 9, 0, 0, DateTimeKind.Utc);
Console.WriteLine(utcDate1);
Console.WriteLine(utcDate1.ToLocalTime());
var utcDate2 = new DateTime(2011, 11, 2, 9, 0, 0, DateTimeKind.Utc);
Console.WriteLine(utcDate2);
Console.WriteLine(utcDate2.ToLocalTime());输出:
2011-10-23 09:00:00
2011-10-23 11:00:00
2011-11-02 09:00:00
2011-11-02 10:00:00https://stackoverflow.com/questions/7979677
复制相似问题