我有一个小型web应用程序(.Net Framwrok 3.5,ASP),用户可以在其中为在服务器上自动执行的操作设置日期-时间,但最近我发现,由于服务器和用户有不同的时区,当用户选择执行操作的时间时,它会在服务器端比计划的时间晚一个小时完成。
这是由于服务器和客户端之间的时区差异造成的。
我正在寻找解决这个问题的最佳方法,并正在考虑下一个选项:
1.-在输入的时间旁边,提供一个时区的下拉列表(例如:UTC+1 Bursels,Copenhage,paris;UTC+2.Etc)。有没有任何方法可以通过编程获得这个列表,或者必须自己编写代码?
2.-做同样的事情,但在我拥有的某种配置文件页面上,这样我可以存储值,但可能会出现用户从不关心设置正确值的情况。
3.-由于一些浏览器脚本或cookie,从用户那里获得时间偏移,这是我找到的最好的方法,但我不确定它的可靠性:http://www.codeproject.com/Questions/107174/How-to-get-client-machine-time-zone
4.-有什么方法可以通过任何简单的C#指令实现它吗?
5.-什么都不做,这是一个选项,不是最好的,因为这种细节很重要,但我不会放弃它。
有很多方法可以解决这个问题。有些涉及JavaScript,有些涉及像Noda Time这样的.NET库,还有一些内置在框架中。
对您来说,最简单的事情可能是使用内置的TimeZoneInfo
类。您可以通过调用TimeZoneInfo.GetSystemTimeZones
来创建时区的下拉列表。您将使用Id
和DisplayName
属性来构建下拉列表,并存储所选的Id
,以便使用TimeZoneInfo
的转换方法进行转换。
如果你想要更准确的转换,你可能想探索将Noda Time与IANA时区一起使用,而不是Windows时区。(有关详细信息,请参阅时区标记wiki)。
如果您不喜欢.Net提供的显示名称,或者需要本地化的时区名称,可以使用TimeZoneNames库而不是TimeZoneInfo.DisplayName
。
您还可以考虑通过两个下拉列表来简化用户体验,一个列出世界上的国家,另一个选择该国家内的时区。这使得只有一个时区的国家变得非常容易,并减少了居住在多个时区国家的用户的选择。
正如我所说,还有其他方法需要考虑,例如在浏览器本身中进行所有UTC到本地的转换,以及只将UTC发送到服务器。
关于尝试通过JavaScript自动获取用户的时区,您应该认识到,您链接到的CodeProject站点中的方法存在缺陷,因为它将时区误认为时差。(时区标签wiki对此进行了详细介绍。)还有其他方法可以进行客户端时区检测,但它们并不完美。最好的建议是询问用户。
最后,如果你想让真正地喜欢你的UI,你可以考虑使用基于地图的时区选择器,而不是(或除了)下拉菜单。我会考虑的两个是dosx时区选择器和timezonepicker.
如果您有更具体的问题,请考虑在StackOverflow上搜索现有的问题。关于时区有很多。你也可以考虑看我的视频课程《Pluralsight的日期和时间基础》,它涵盖了这一点和许多其他相关主题。