如何处理来自服务器和客户端的时区差异

How to deal with difference in timezones from server and client

我有一个小型 Web 应用程序(.Net Framwrok 3.5,ASP),其中用户将日期时间设置为在服务器上自动执行的操作,但最近我发现由于服务器和用户有不同的时区,当用户选择时间执行操作时,它会比预定的时间晚一小时在服务器端完成。

这是由于服务器和客户端的时区不同造成的。

我正在寻找解决此问题的最佳方法,我正在考虑下一个选项:

1.- 在时间输入旁边给出时区下拉列表(例如:UTC +1 布尔塞尔、哥本哈日、巴黎;UTC+2.. 等)。 有没有办法以编程方式获取此列表或必须自己编写代码?

2.- 做同样的事情,但在我拥有的某种个人资料页面上,这样我可以存储值,但可能会出现用户永远不会注意设置正确值的情况。

3.- 由于某些浏览器脚本或 cookie 而获取用户的时间偏移,这是我发现的最好的方法,但我不确定它的可靠性: http://www.codeproject.com/Questions/107174/How-to-get-client-machine-time-zone

4.- 有没有办法通过任何简单的 C# 指令获得它?

5.-什么都不做,这是一个选择,不是最好的选择,因为这种细节确实很重要,但我不会放弃它。

许多 方法可以解决这个问题。有些涉及 JavaScript,有些涉及 .NET 库,如 Noda Time,还有一些内置于框架中。

对您来说最简单的事情可能就是使用内置的 TimeZoneInfo class. You can create a drop-down list of time zones by calling TimeZoneInfo.GetSystemTimeZones。您将使用 IdDisplayName 属性来构建下拉列表,并存储所选的 Id 以用于使用 TimeZoneInfo.

的转换方法进行转换

如果您想要更准确的转换,您可能想要探索使用 Noda Time IANA 时区而不是 Windows 时区。 (有关详细信息,请参阅 时区标签 wiki)。

如果您不喜欢 .Net 提供的显示名称,或者如果您需要本地化的时区名称,您可以使用 TimeZoneNames 库而不是 TimeZoneInfo.DisplayName

您还可以考虑通过 两个 下拉菜单来简化用户体验 - 一个会列出世界上的国家,另一个会选择其中的时区国家。这使得具有一个时区的国家的事情变得非常容易,并减少了生活在多个时区的国家的用户的选择。

正如我所说,还有其他方法需要考虑,例如在浏览器本身中进行所有 UTC 到本地的转换,以及只将 UTC 发送到服务器。

关于尝试通过 JavaScript 自动获取用户的时区,您应该认识到您链接到的 CodeProject 站点中的方法存在缺陷,因为它弄错了 时区 时区偏移。 (The timezone tag wiki covers more about this.) There are other ways to do client-side time zone detection,但它们并不完美。最好的建议是询问您的用户。

最后,如果您想真正喜欢您的UI,您可以考虑使用基于地图的时区选择器而不是(或另外to) 下拉。我会考虑的两个是 dosx timezone-picker, and timezonepicker.com.

如果您有更具体的问题,请考虑在 Whosebug 上搜索现有问题。关于时区有很多。您也可以考虑在 Pluralsight 上观看我的视频课程 Date and Time Fundamentals - 其中涵盖了这个主题和许多其他相关主题。