SQL Server在3个不同时区的日期和服务器

时间:2014-06-10 02:13:25

标签: asp.net sql timezone utc

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

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

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

不会使世界上任何地方的日期/时间显示正确吗?

但是在以下时间似乎是1小时:

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

运行ASP.NET的Web服务器位于不同的时区(也可能是DST,也可能不是DST)。

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

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

1 个答案:

答案 0 :(得分:1)

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

使用ToLocalTime时,您正在使用运行代码的计算机的本地时区 。在这种情况下 - 您的Web服务器。

网络服务器完全不知道您的用户的时区。您必须在应用程序逻辑中自行管理。由于您坚持使用.Net 1.1,因此您无法轻松管理此服务器端。您必须采用客户端JavaScript方法:

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

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

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

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

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