.NET将日期时间转换为UTC,考虑时区

13

使用C#,我需要将传入的日期时间值转换为UTC。我知道.NET中有这些转换的功能,但我所拥有的唯一时区标识是标准时区列表。

http://www.timegenie.com/timezones

什么是在.NET中实现这个的最佳方法?我需要创建一个映射表来将时区转换为TimeZoneInfo.GetSystemTimeZones()中的ID(例如“Pacific Standard Time (Mexico)”),以便我可以使用TimeZoneInfo.FindSystemTimeZoneById()吗?
感谢任何帮助。

1
你如何知道传入的值是否具有时区信息? - Alastair Pitts
你的输入是一个 DateTime 和一个 UTC 偏移量吗?那么请看一下 DateTimeOffset 结构。否则,你能给出一个输入和期望输出的例子吗? - dtb
这个问题 https://dev59.com/G1PTa4cB1Zd3GeqPh0g9#6826513 不完全是你所问的。但这将为实现提供良好的指导。 - Jeyara
@svick: 你不能使用模糊的名称(如AST)将时区存储在数据库中。你需要通过调用GetSystemTimeZones来获取它们的ID,在这种情况下会得到“阿拉伯标准时间”和“大西洋标准时间”。 - Bennor McCarthy
@Bennor,是的,但我假设传入的日期将使用缩写。 - svick
显示剩余2条评论
3个回答

18

我之前通过使用映射表在数据库中存储时区ID的方法实现过这个功能,即创建一个包含 TimeZone.GetSystemTimeZones() 结果的表格。

但你实际上不需要使用 TimeZoneInfo.FindSystemTimeZoneById() 方法来进行转换:你可以使用 TimeZoneInfo.ConvertTimeBySystemTimeZoneId() 的其中一个重载来完成。该方法有一些重载,其中一些使用 DateTime 值,另一些使用 DateTimeOffset 值(后者更好,因为它们指定了一个明确的时间点)。

例如:

TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.Now, "New Zealand Standard Time", "UTC")

使用系统时区 ID 而不是存储在数据库中的偏移量的真正好处是,夏令时将由 TimeZoneInfo.ConvertTimeBySystemTimeZoneId 自动处理。


3

我认为他正在寻找解析带有时区信息的日期字符串,而这些方法并不适用。 - Christopher Currens

2

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