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

标签 c# asp.net datetime timezone

我有一个小型网络应用程序(.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 创建时区下拉列表。 .您将使用 IdDisplayName 属性来构建下拉列表,并存储所选的 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/

相关文章:

c# - 命名空间 'Microsoft.EntityFrameworkCore' 中不存在“迁移”

java - 将完整日期转换为短日期

c# - 应用程序启动Windows Phone时如何播放声音

c# - 使用 ViewModel 来自具有默认值的 Enum 的 DropDownListFor

c# - Blazor 错误 400,ReasonPhrase 错误请求版本 : 1. 1 System.Net.Http.BrowserHttpHandler

c# - 具有键 'XXX' 的 ViewData 项的类型为 'System.Int32' 但必须为 'IEnumerable<SelectListItem>' 类型

asp.net - 离线使用 Google map

javascript - 为输入控件动态添加 pattern 和 title 属性

datetime - 为什么是 "error: invalid escape sequence?"

ruby - 我需要包含哪些模块才能让 5.seconds 在 Ruby 中工作?