2014-09-12 30 views
4

当我觉得应该返回8.25时,下面的代码返回9.25,我误解了什么?DateTimeOffset TotalHours返回不同的值

(new DateTimeOffset(2014,09,04,08,15,00,new TimeSpan(0,0,0))).Subtract(new DateTimeOffset(2014,09,04,08,15,00,new TimeSpan(0,0,0)).Date).TotalHours 

更简单地表现为: - 对

DateTimeOffset start = new DateTimeOffset(2014,09,04,08,15,00,new TimeSpan(0,0,0)); 
double result = start.Subtract(start.Date).TotalHours 

当在时区GMT在Windows 7 PC上运行(调整为夏令时间): -

9月12日的结果= 9.25

12月12日结果= 8.25

回答

10

的问题是,所述DateTimeOffset.Date财产返回一个DateTime未指定的Kind。那么当你从DateTimeOffset中减去它时,就假设它是系统本地的。

您可以通过要求输入UtcDateTime解决这个问题,并得到Date来自:

double result = start.Subtract(start.UtcDateTime.Date).TotalHours 

当然,这是假设您想要的Date是该日的UTC日期/时间下降。我们不太了解您的实际需求。您可能需要考虑使用我的Noda Time库来避免这种模糊性 - 但有更多类型可供选择,它允许您更清楚地指定您的意图。

+0

谢谢你,让我疯狂一段时间,因为开发和生产都在不同的时区。 – 2014-09-12 13:47:22

+0

我已经在去年多次阅读了Noda时间 - 这可能是通过实体框架5 DateTimeOffset类型询问SQL服务器DateTimeOffset(7)兼容性的正确时机。我是否会一直转换到/来自DateTimeOffsets,从而依靠创建C#代码进化模式,而不是将我的设计意图嵌入到POCO对象中? – 2014-09-12 14:38:24

+0

@Oldfart:恐怕EF不支持直接使用自定义类型。但是你不需要“一直”这样做 - 通常你只是创建一个“好友属性”,我相信(我本人不是EF的人)。查看http://stackoverflow.com/questions/25143549 - 然后你的大部分代码就可以使用Noda Time,并且它将从OffsetDateTime转换为DateTimeOffset以实现持久性。 – 2014-09-12 14:39:57