2010-07-12 43 views
4

如果我运行像一个片段:UtcNow和现在是相同的日期时间?他们知道他们不同吗?

bool areTheyTheSame = DateTime.UtcNow == DateTime.Now 

我究竟会得到什么? DateTime返回是否知道它的时区,以便我可以比较?

我的具体问题是,我试图构建一个类似缓存的API。如果需要一个DateTime AbsoluteExpiration,是否必须强制我的API的用户知道是否给我一个UTC时间或基于时区的时间?

[编辑]这太问题是我的问题,也是极其相关:Cache.Add absolute expiration - UTC based or not?

[编辑]只是为了澄清对未来的读者,在DateTimeKind是什么,是不同的。未定义的DateTimeKind常常是一个问题,例如,当您从数据库中取出某个数据库时,会出现这种问题。设置DateTimeKind在DateTime构造...

[编辑] JonSkeet写了一个可爱的博客文章,谴责这种行为,并提供了解决方案:http://noda-time.blogspot.co.uk/2011/08/what-wrong-with-datetime-anyway.html

回答

6

你真的尝试自己的片段?

它们不同,直接比较没有考虑到差异,但可以通过调用ToUniversalTime将本地转换为UTC。

var now = DateTime.Now; 
var utcNow = DateTime.UtcNow; 

Console.WriteLine(now);       // 12/07/2010 16:44:16 
Console.WriteLine(utcNow);      // 12/07/2010 15:44:16 
Console.WriteLine(now.ToUniversalTime());  // 12/07/2010 15:44:16 
Console.WriteLine(utcNow.ToUniversalTime()); // 12/07/2010 15:44:16 

Console.WriteLine(now == utcNow);       // False 
Console.WriteLine(now.ToUniversalTime() == utcNow);  // True 
Console.WriteLine(utcNow.ToUniversalTime() == utcNow); // True 
+1

我没有尝试,但主要是因为我很惊讶,这个问题是不是已经SO并认为这将是对人有益的。也许有点懒惰,但我发誓,主要是好心! ;) – 2010-07-12 14:51:46

+0

我想看到的关键测试可能是,“Console.WriteLine(utcNow.ToUniversalTime()== utcNow)”的结果;“... – 2010-07-12 14:52:59

+2

+1。另外,还有一个不同的DateTimeKind。有另一个方向的'ToLocalTime()'。小心'DateTimeKind.Undefined',这些时间总是被转换('ToUniversalTime'将它们当作本地时间,'ToLocalTime'视为UTC)。 – 2010-07-12 14:57:28

0

DateTime.Now返回系统时间,而DateTime.UtcNow返回UTC时间。

相关问题