【问题标题】:Are UtcNow and Now the same datetime? Do they know they're different?UtcNow 和 Now 是同一个日期时间吗?他们知道他们不一样吗?
【发布时间】:2011-03-14 20:19:30
【问题描述】:

如果我像这样运行 sn-p:

bool areTheyTheSame = DateTime.UtcNow == DateTime.Now

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

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

[编辑] 这个 SO 问题也与我的问题极为相关: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

【问题讨论】:

    标签: c# datetime timezone utc


    【解决方案1】:

    还要小心在夏令时到来时拨打当地的DateTime 并致电.ToUniversalTime()

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        你真的亲自尝试过 sn-p 吗?

        它们是不同的,直接比较并不能说明差异,但您可以通过调用 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
        

        【讨论】:

        • 我没有尝试过,但主要是因为我很惊讶这个问题已经不在 SO 上,并认为这对人们有用。也许有点懒惰,但我发誓,主要是出于好意! ;)
        • 我想看的关键测试可能是“Console.WriteLine(utcNow.ToUniversalTime() == utcNow);”的结果...
        • +1。此外,还有一个不同的DateTimeKind。另一个方向有一个ToLocalTime()。注意DateTimeKind.Undefined,这些时间总是被转换的(ToUniversalTime 将它们视为本地时间,ToLocalTime 视为 UTC)。
        猜你喜欢
        • 2011-10-20
        • 1970-01-01
        • 2013-11-28
        • 2020-07-22
        • 1970-01-01
        • 1970-01-01
        • 2012-08-08
        • 1970-01-01
        • 2012-05-08
        相关资源
        最近更新 更多