我有一个小型Web应用程序(.Net Framwrok 3.5,ASP),用户在服务器上自动执行操作的日期时间,但最近我发现由于服务器和用户有不同的时区,用户选择执行操作的时间,它在服务器端比完成的操作晚一小时完成。
这是由服务器和客户端的时区差异引起的。
我正在寻找解决此问题的最佳方法,并考虑下一个选项:
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.-什么都不做,这是一个选择,不是最好的,因为这种细节确实很重要,但我不会丢弃它。
答案 0 :(得分:1)
有许多方法来解决此问题。一些涉及JavaScript,一些涉及.NET库,如Noda Time,还有一些内置于框架中。
您可能最简单的方法是使用内置的TimeZoneInfo
类。您可以致电TimeZoneInfo.GetSystemTimeZones
创建时区下拉列表。您可以使用Id
和DisplayName
属性来构建下拉列表,并使用Id
的转换方法存储选定的TimeZoneInfo
以用于转化。
如果您想要更准确的转化,可能需要使用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,但它们并不完美。最好的建议是询问您的用户。
最后,如果您希望真的喜欢您的UI,您可以考虑使用基于地图的时区选择器而不是(或除了)下拉菜单。我要考虑的两个是dosx timezone-picker和timezonepicker.com。
如果您有更多具体问题,请考虑在StackOverflow上搜索现有问题。关于时区有许多。你也可以考虑在Pluralsight上观看我的视频课程Date and Time Fundamentals,其中涵盖了这个以及许多其他相关主题。