".NET通过时区名称获取时区偏移量"

34

我在数据库中存储所有日期/时间都是以协调世界时(UTC)为准。

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

为了显示正确的时间,我考虑需要将用户的时区偏移量加到UTC日期/时间上。但我怎样才能根据时区名称获取时区偏移量呢?

谢谢!

3个回答

53

这对我似乎不起作用。目前,在“E.澳大利亚标准时间”区域中是夏令时,因此他们的时间是GMT+11。但是,当我运行此代码时,我得到了10小时的结果。它应该是11。代码是:TimeZoneInfo.FindSystemTimeZoneById("E. Australia Standard Time").GetUtcOffset(Now.ToUniversalTime).Hours。我做错了什么? - ingredient_15939
@ingredient_15939 - 可能没有任何问题。您是否检查了运行此程序的计算机是否正确设置了使用夏令时? - Oded
1
谢谢Oded。你说的“设置正确使用”,是什么意思?我遇到了不一致的结果 - 我刚刚发布了一个问题,请帮忙解答。https://dev59.com/Dl3Va4cB1Zd3GeqPEuAa - ingredient_15939
1
@ingredient_15939,您正在指定东澳大利亚标准时间,它始终为+10。东澳大利亚夏令时为+11。 - Shiv
我发现对于"AUS Eastern Standard Time",我得到了正确的结果:在夏令时期间,日期相差11个小时;否则相差10个小时。 - Steve Lang
我发现对于"AUS Eastern Standard Time",我得到了正确的结果:夏令时期间是11小时,否则是10小时。 - undefined

5
你可以使用 TimeZoneInfo 类的 GetSystemTimeZones() 方法获取服务器上配置的所有时区列表,并将其与客户端的时区进行匹配。
不过为什么你的时区格式是“美国东部标准时间”?这是从哪里来的?

好主意,我现在会尝试一下 :)我正在使用GetSystemTimeZones()返回的集合填充一个下拉列表。 - Daniil Harik
为什么不将实际的对象作为下拉列表中的“项”添加,而不是使用集合中每个“TimeZone”对象的Id/字符串填充下拉列表?这样,当下拉列表更改时,您只需使用(TimeZoneInfo)myDropDown.SelectedItem获取对TimeZoneInfo对象的引用。然后,您就不需要每次调用.FindSystemTimeZoneById,因为您已经拥有该对象了。 - Carlos P

3

不要手动添加,你应该利用TimeZoneInfoConvertTime方法,它可以根据你指定的时区进行日期转换。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接