.NET Get timezone offset by timezone name
在数据库中,我以UTC格式存储所有日期/时间。
我知道用户的时区名称(例如"美国东部标准时间")。
为了显示正确的时间,我认为我需要将用户的时区偏移量添加到UTC日期/时间。 但是如何通过时区名称来缩短时区?
谢谢!
您可以使用TimeZoneInfo.FindSystemTimeZoneById来使用提供的Id获取TimeZoneInfo对象,然后使用TimeZoneInfo.GetUtcOffset:
1 2
| TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("US Eastern Standard Time");
TimeSpan offset = tzi.GetUtcOffset( myDateTime); |
-
这解决了我的问题。谢谢!
-
这对我来说似乎不起作用。目前,它是"E. Australia Standard Time"区域的DST,所以他们的时间是GMT + 11。但是,当我运行这个时,我得到了10个小时的结果。它应该是11.代码是:TimeZoneInfo.FindSystemTimeZoneById("E.澳大利亚标准时间").GetUtcOffset(Now.ToUniversalTime).Hours。我究竟做错了什么?
-
@ ingredient_15939 - 可能没错。您是否检查过运行的计算机是否设置为正确使用DST?
-
谢谢Oded。设置为正确使用它是什么意思?我实际上遇到了不一致的结果 - 我刚刚发布了一个问题,请尽可能帮忙。 stackoverflow.com/questions/8356866/…
您可以使用TimeZoneInfo类的GetSystemTimeZones()方法来获取服务器上配置的所有时区的列表,并将其与客户端中的时区匹配。
虽然为什么你的时区有"美国东部标准时间"的格式? 那个是从哪里来的?
-
好主意,现在就试试:)我用GetSystemTimeZones()返回的集合填充一个下拉列表
-
而不是使用集合中每个TimeZone对象的Id /字符串填充下拉列表,为什么不在下拉列表中将实际对象添加为Item s?这样,当下拉列表发生变化时,你可以使用(TimeZoneInfo)myDropDown.SelectedItem获取对TimeZoneInfo对象的引用。那么你每次都不需要调用.FindSystemTimeZoneById,你已经有了这个对象。
您应该利用TimeZoneInfo的ConvertTime方法,而不是进行一些手动添加,它将根据您指定的TimeZone处理转换日期。
1
| var localizedDateTime = TimeZoneInfo.ConvertTime(yourDateTime, localTimeZoneInfo); |