如何处理来自服务器和客户端的时区差异
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
。您将使用 Id
和 DisplayName
属性来构建下拉列表,并存储所选的 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 - 其中涵盖了这个主题和许多其他相关主题。
我有一个小型 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
。您将使用 Id
和 DisplayName
属性来构建下拉列表,并存储所选的 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 - 其中涵盖了这个主题和许多其他相关主题。