首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >冬/夏时间的DateTime.ToLocalTime()

冬/夏时间的DateTime.ToLocalTime()
EN

Stack Overflow用户
提问于 2011-11-02 19:36:59
回答 4查看 13.7K关注 0票数 10

我正在使用DateTime.ToLocalTime()将日期从协调世界时转换为本地时间。我的时区是GMT+1(贝尔格莱德,布达佩斯,卢比纳...),它是在Windows设置(XP)中正确设置的。

上周末在我们的时区,我们将冬季时间改为夏季时间,这意味着我们将当地时间拨回了一个小时。

在我看来,从那一刻起,ToLocalTime方法的行为就变得奇怪了。当我使用它来转换冬季时间更改后的日期时,它工作得很好,如下所示:

代码语言:javascript
复制
var utcDate2 = new DateTime(2011, 11, 2, 9, 0, 0,DateTimeKind.Utc);

utcDate1.ToLocalTime()值为:2011.11.02. 10:00:00 it is

Burt当我想要转换此更改之前的日期(例如,夏季时间的日期)时,它会返回一个不好的值,如下所示:

代码语言:javascript
复制
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?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-02 19:40:16

http://msdn.microsoft.com/en-us/library/system.datetime.tolocaltime.aspx

在Windows XP系统上,当从UTC转换为本地时间时,ToLocalTime方法仅识别当前的调整规则。因此,当前调整规则生效前的期间换算可能无法准确反映UTC和本地时间之间的差异。

因此,你必须找到另一种方法来解决这个问题。

票数 6
EN

Stack Overflow用户

发布于 2011-11-02 19:51:30

我的猜测是,你系统上的时区数据可能已经过时了--或者是由于jsobo提到的限制。

您可能希望(谨慎地)使用我的日期/时间应用编程接口Noda Time。它具有与DateTime之间的转换,因此您可以在代码中的其他地方使用DateTime,尽管很明显,我相信如果您始终使用Noda Time,您的代码会更清晰:)

Noda Time还没有“v1.0就绪”,但主要是因为缺少一些功能。当然,您是否愿意承担非v1.0开源项目的风险取决于您,但我很乐意帮助您解决遇到的任何问题。(我真的在努力寻找现实生活中的用例,所以如果您需要任何缺少的功能,我很可能能够在其他人需要相同功能的情况下实现它们。)

Noda Time使用的是zoneinfo时区数据库,而不是Windows内置的时区数据库,所以它应该不会有同样的问题。

为了进行检查,您可以使用如下代码:

代码语言:javascript
复制
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);
票数 1
EN

Stack Overflow用户

发布于 2011-11-02 19:55:00

我使用相同的时区,当我尝试它时,我得到了正确的值:

代码语言:javascript
复制
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());

输出:

代码语言:javascript
复制
2011-10-23 09:00:00
2011-10-23 11:00:00
2011-11-02 09:00:00
2011-11-02 10:00:00
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7979677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档