2015-11-04 20 views
0

在英国的时钟改变了25/10/2015.NET DateTime.ToLocalTime是否跨DST更改持续存在?

如果我在24/10/2015跑到下面的代码,并再次在26/10/2015,将相同的输出产生?

从我的日期时间的东西如何在C#我假设是的,但我想仔细检查,因为它是我的应用程序的关键知识。

// January date outside of DST 
var januaryDate = new DateTime(2015, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
Console.WriteLine(januaryDate.ToLocalTime().ToString()); 

// April date inside DST 
var aprilDate = new DateTime(2015, 4, 1, 0, 0, 0, DateTimeKind.Utc); 
Console.WriteLine(aprilDate.ToLocalTime().ToString()); 
+0

当地时间意味着无论你*当前时区*为。即使是同一台机器上的不同用户也可能使用不同的时区。如果您关心偏移量,请使用DateTimeOffset,而不是DateTime。如果这是关键的(因为它是例如在航空旅行),检查NodaTime以及 - 它包含了最新IANA时区数据库,这样你就不必猜测,BST手段(巴西或英国),或什么是正确的达拉斯 –

+0

偏移@ PanagiotisKanavos谢谢,但不幸的是卡住了DateTime类型。假设这个问题,它是同一台机器上的同一个用户。 –

+0

那你就麻烦了。至少,指定日期类型(即本地或UTC),因为现在它是未指定的并且被视为UTC。 'ToLocalTime()'在我的机器上应用了一个2小时的偏移量,它是'+2:00'。猜猜这也回答你的问题,但也显示你为什么有麻烦。除非你做** **一定的偏移量还是那种被存储在您的日期(即数据库,文件等)和妥善处理之前设置,你可以有意想不到的效果 –

回答

3

ToLocalTime使用当前时区的规则,而不仅仅是当前的偏移计算本地时间。调用ToLocalTime2015-01-01 00:002015-04-01 00:00将返回相同的结果呼叫是否之前或DST变化后作出的。

我当前的偏移量是+2,但调用示例代码在第一种情况下返回1/1/2015 2:00:00 am,在第二种情况下返回1/4/2015 3:00:00 am

检查ToLocalTime参考源显示,返回本地时间之前被应用在特定日期的方法检查DST是否需要:

Boolean isDaylightSavings = false; 
Boolean isAmbiguousLocalDst = false; 
Int64 offset = TimeZoneInfo.GetUtcOffsetFromUtc(this, TimeZoneInfo.Local, 
          out isDaylightSavings, out isAmbiguousLocalDst).Ticks; 

long tick = Ticks + offset; 
//various validations 
//... 
return new DateTime(tick, DateTimeKind.Local, isAmbiguousLocalDst); 
+0

不错的一个!这帮了我很大的忙,希望能帮助别人 –

相关问题