UtcNow和现在是相同的日期时间吗?他们知道他们有所不同吗?

时间:2010-07-12 14:09:38

标签: c# datetime timezone utc

如果我运行的代码如下:

bool areTheyTheSame = DateTime.UtcNow == DateTime.Now

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

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

[编辑]这个问题与我的问题非常相关:Cache.Add absolute expiration - UTC based or not?

[编辑]为了澄清未来的读者,DateTimeKind是不同的。未定义的DateTimeKind通常是一个问题,例如,当您从数据库中取出一个时,就会得到这个问题。在DateTime构造函数中设置DateTimeKind ...

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

3 个答案:

答案 0 :(得分: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 :(得分:2)

在夏令时出现时,也要警惕当地DateTime并致电.ToUniversalTime()

请参阅此处备注部分中的注释:http://msdn.microsoft.com/en-us/library/system.timezone.touniversaltime.aspx

答案 2 :(得分:0)

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