【问题标题】:DateTime.Now represented as GMT Time on a PST ServerDateTime.Now 表示为 PST 服务器上的 GMT 时间
【发布时间】:2011-07-13 10:18:37
【问题描述】:

我将信息存储在数据库中并将我的 POCO 的属性设置为 DateTime.Now。

当显示此值时,它显示为 PST 时间。我希望它显示为 GMT 时间。

我做这样的事情来显示/存储它还是有更好的方法?

TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("GMT");  
var GMTTime = TimeZoneInfo.ConvertTimeToUtc(DateTime.Now, tz));

还需要考虑夏令时,因为英国在一年中的时钟更改时间与美国不同:

更新:我发现在 TimeZone 设置中,您可以通过 GMT 标准时间或格林威治标准时间,首先要考虑 DST

【问题讨论】:

  • 问题含糊不清 - “考虑夏令时”是什么意思?您想根据夏令时在英国是否有效来不同地显示时间吗?我的回答回答了您希望它在“检测并丢弃它”的意义上“考虑”夏令时的情况。
  • 我希望它显示英国的任何时间。由于美国和英国一年中时钟变化的时间不同,因此只需考虑这一点。无论哪种方式,最终结果都必须是英国的实际时间

标签: c# .net asp.net-mvc datetime


【解决方案1】:

将其存储为UTC。它专为独立于通用时区的时间而设计。

DateTime currentUtcTime = DateTime.UtcNow;
DateTime localTime = currentUtcTime.ToLocalTime();
DateTime backToUtcAgain = localTime.ToUniversalTime();

给定的DateTime 是否已经是UTC 或本地时间由DateTime.Kind 确定。在序列化/反序列化 DateTime 值(例如来自数据库)时,您必须牢记这一点,因为这些信息通常不会被存储,并且当您返回您的 DateTime 时,它大部分时间都会有 DateTimeKind.Unspecified 的值,这可能会导致转换方法出现问题。我只是确保在从持久数据存储中加载某些内容时强制使用DateTimeKind.Utc

【讨论】:

  • 我认为这不考虑夏令时
  • @Jon:是的,当转换为当地时间时。 UTC 本身没有任何夏令时。 (诚​​然,有时当地时间可能是模棱两可的......)
  • @Jon Skeet:OP 在 GB 时区的上下文中询问 GMT,而不是在 UTC 的上下文中。英国有夏令时,所以在夏天他们的时区将是 BST = GMT+1。
  • @Daniel:啊,我错过了对问题的编辑。听起来对我来说是一个奇怪的要求。存储为 UTC,然后根据请求将其转换为 any 时区是最合适的解决方案。考虑到代码示例,OP 似乎有点困惑,这似乎等同于 GMT 和 UTC...
  • 但如果我在 PST 服务器上转换为当地时间,那将不是美国当地时间而不是英国时间
【解决方案2】:

DateTime.UtcNow 可以满足您的需求。

【讨论】:

    【解决方案3】:

    看看 DateTimeOffset。

    我建议将您的 DateTime 属性更改为这种类型

    MSDN DateTime vs. DateTimeOffSet

    【讨论】:

    • 同意。永远不要再使用DateTime 全球日期!
    【解决方案4】:

    您可以将其添加到扩展方法中以使其更好

    public static DateTime ConvertToGreenwichMeanTime(this DateTime utcDateTime)
    {
        return TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"));
    }
    

    那就叫它吧

    DateTime.UtcNow.ConvertToGreenwichMeanTime();
    

    【讨论】:

      猜你喜欢
      • 2018-02-13
      • 1970-01-01
      • 2012-04-20
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多