【问题标题】:SQL Server dates and servers in 3 different time zones3 个不同时区的 SQL Server 日期和服务器
【发布时间】:2014-07-30 16:12:31
【问题描述】:

我认为这是正确的做法,但显然不是。

我使用默认的 GetUtcDate() 将日期写入 SQL Server 数据库。

我在 ASP.NET 中读回它并使用 theTime.ToLocalTime() 将其显示给用户。 (它已经是 UTC,所以我需要将其转换为本地时间,而不是再次转换为 UTC 时间。)

这不会使日期/时间在世界任何地方都能正确显示吗?

但似乎是 1 小时的休息时间:

SQL Server 位于 1 个时区(可能是...或不在 DST 地区或一年中的某个时间)。

运行 ASP.NET 的网络服务器位于不同的时区(那里可能是也可能不是 DST)。

查看日期/时间的本地用户也处于完全不同的时区(那里也有或没有 DST)。

(我不确定这是否重要,但网络服务器只有 .net v1.1,永远不会升级到 v2 或其他任何东西。)

【问题讨论】:

    标签: asp.net sql timezone utc


    【解决方案1】:

    使用GETUTCDATE 存储UTC 值很好。将 UTC 值检索到 Web 服务器上的 DateTime 对象中也可以。不调用ToLocalTime

    当您使用ToLocalTime 时,您使用的是运行代码的机器的本地时区。在这种情况下 - 您的网络服务器。

    网络服务器完全不知道您用户的时区。您必须在应用程序逻辑中自行管理。由于您被困在 .Net 1.1 上,因此您没有简单的方法来管理此服务器端。您必须采用客户端 JavaScript 方法:

    • 以非显示方式将 UTC 值传递给客户端。例如,XHR 调用或内联脚本。
    • 最好使用ISO-8601 格式,例如2014-06-10T09:30:00.000Z。您可以使用 .ToString("o") 从您的 DateTime 对象中获取此信息。
    • 在客户端,如果您使用较新的 Web 浏览器,您可以将此字符串直接传递到 JavaScript Date 对象的构造函数中。但是,您可能更喜欢使用更强大的库来实现浏览器兼容性和增强的格式化功能。我推荐moment.js
    • 通过将 UTC 值传递给浏览器,您已经委派了计算用户时区的工作。调用Datemoment 对象上的任何输出方法将自动显示转换为用户时区的时间。

    有很多服务器端方法,但它们需要您更新到更合理的 .NET Framework 版本。

    使用任何服务器端机制,您都需要将应用程序更改为:

    • 在应用程序的某些设置部分中询问用户他们的时区。
    • 在将字符串传送到 Web 浏览器之前,将该时区应用于 UTC 日期。

    此外,您应该认识到 .NET 1.1 于 2003 年发布,并且远远超过其生命周期结束日期。您应该查看the chart here 并考虑升级。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 2013-07-13
      • 1970-01-01
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多