我有一个小型网络应用程序(.Net Framwrok 3.5,ASP),用户可以在其中将日期时间设置为在服务器上自动执行的操作,但最近我发现由于服务器和用户有不同的时区,当用户选择一个时间来执行一个 Action ,它比预定的时间晚一小时在服务器端完成。
这是由于服务器和客户端的时区不同造成的。
我正在寻找解决这个问题的最佳方法,并且正在考虑下一个选项:
1.- 在时间输入旁边给出时区下拉列表(例如:UTC +1 Bursels、Copenhage、paris;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)。您可以通过调用 TimeZoneInfo.GetSystemTimeZones
创建时区下拉列表。 .您将使用 Id
和 DisplayName
属性来构建下拉列表,并存储所选的 Id
以用于使用 的转换方法进行转换>时区信息
。
如果您想要更准确的转化,您可能想要探索使用 Noda Time使用 IANA 时区而不是 Windows 时区。 (有关详细信息,请参阅 the timezone tag wiki)。
如果您不喜欢 .Net 提供的显示名称,或者如果您需要本地化的时区名称,您可以使用 TimeZoneNames库而不是 TimeZoneInfo.DisplayName
。
您还可以考虑通过两个下拉菜单来简化用户体验 - 一个会列出世界上的国家,另一个会选择该国家/地区的时区。这使得具有一个时区的国家/地区的事情变得非常容易,并减少了生活在多个时区国家/地区的用户的选择。
正如我所说,还有其他方法需要考虑,例如在浏览器本身中完成所有 UTC 到本地的转换,并且只将 UTC 发送到服务器。
关于尝试通过 JavaScript 自动获取用户的时区,您应该认识到您链接到的 CodeProject 站点中的方法是有缺陷的,因为它将时区误认为是时区抵消。 ( The timezone tag wiki 涵盖更多内容。)有 other ways to do client-side time zone detection ,但它们并不完美。最好的建议是询问您的用户。
最后,如果您想真正喜欢您的用户界面,您可以考虑使用基于 map 的时区选择器来代替(或除此之外)下拉菜单。我会考虑的两个是 dosx timezone-picker , 和 timezonepicker.com .
如果您有更具体的问题,请考虑在 StackOverflow 上搜索现有问题。关于时区有很多。您也可以考虑观看我的视频类(class),Date and Time Fundamentals在 Pluralsight 上 - 涵盖了这个主题和许多其他相关主题。
关于c# - 如何处理来自服务器和客户端的时区差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28353809/