2010-06-05 90 views
24

在数据库中,我使用UTC存储所有日期/时间。.NET通过时区名称获取时区偏移

我知道用户的时区名称(例如“美国东部标准时间”)。

为了显示正确的时间,我想我需要添加用户的时区偏移到UTC日期/时间。但是,我如何通过时区名称获得时区偏移?

谢谢!

回答

37

您可以使用TimeZoneInfo.FindSystemTimeZoneById获得使用提供的ID TimeZoneInfo.GetUtcOffset不同于TimeZoneInfo对象,那么:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("US Eastern Standard Time"); 
TimeSpan offset = tzi.GetUtcOffset(myDateTime); 
+0

这解决了我的问题。谢谢! – 2010-06-05 07:43:35

+0

这似乎不适用于我。目前,它是“E.澳大利亚标准时间”区域的DST,因此它们的时间是GMT + 11。但是,当我运行这个时,我得到了10个小时的结果。它应该是11.代码是:TimeZoneInfo.FindSystemTimeZoneById(“E。澳大利亚标准时间”)。GetUtcOffset(Now.ToUniversalTime).Hours。我究竟做错了什么? – 2011-12-02 13:07:10

+0

@ ingredient_15939 - 可能没有错。您是否检查过运行的计算机是否设置为正确使用DST? – Oded 2011-12-02 13:08:13

4

您可以使用TimeZoneInfo类的GetSystemTimeZones()方法来获取服务器上配置的所有时区的列表,并将其与客户端中的时区相匹配。

虽然为什么你有格式“美国东部标准时间”的时区?那个是从哪里来的?

+0

伟大的想法,现在试试吧:) 我填充一个下拉与GetSystemTimeZones返回(集合) – 2010-06-05 07:28:48

+0

而不是在ID /每'TimeZone'对象的字符串填充下拉集合,为什么不把实际对象添加为下拉菜单中的'Item's?这样,当下拉改变时,你可以使用'(TimeZoneInfo)myDropDown.SelectedItem'获取对TimeZoneInfo对象的引用。然后你不需要每次都调用'.FindSystemTimeZoneById',你已经拥有了目的。 – 2013-07-15 13:51:51

2

,而不是做一些手工此外,你应该采取的TimeZoneInfoConvertTime方法将处理转换的优势你的日期基于你指定的时区。

var localizedDateTime = TimeZoneInfo.ConvertTime(yourDateTime, localTimeZoneInfo); 
+0

优秀的建议。 – 2015-08-12 06:51:12