跨越不同时区进行带有夏令时的时间转换

6

我有一个处理程序,它接受带有时区的日期时间值作为字符串(数据来自外部系统)。我需要将此日期时间转换为本地机器时区下的时间。

示例代码:

string cetId = "Central European Standard Time";
if (timeZone == "CET")
{
    TimeZoneInfo cetZone = TimeZoneInfo.FindSystemTimeZoneById(cetId);
    returnDateTime = TimeZoneInfo.ConvertTime(statusDateTime, cetZone, TimeZoneInfo.Local);
}
else if (timeZone == "CEST")
{
    TimeZoneInfo cestZone = TimeZoneInfo.FindSystemTimeZoneById(cetId);
    returnDateTime = TimeZoneInfo.ConvertTime(statusDateTime, cestZone, TimeZoneInfo.Local);
}

如果时间是CEST(中欧夏令时)而不是CET(中欧时间),我是否需要采取特定措施,或者.NET TimeZoneInfo对象是否处理该场景?

3个回答

1

你应该没问题了。

你告诉ConvertTime两个时区(源和目标)。

你有具体的问题还是只是要求确认?


我只是担心夏令时在不同的时区会在不同的日期开始,我担心时间无法正确转换。 - Tadhg

0

TimeZoneInfo.ConvertTime()开始

The value of the Kind property of the dateTime parameter must correspond to the sourceTimeZone parameter, as the following table shows.

只是想补充一下,你需要注意你的StatusDateTime的“Kind”属性。在你的情况下,它必须是“未指定”。请查看“备注”部分。


0

我一段时间前创建了一个库来封装这些类型的转换:

https://github.com/b9chris/TimeZoneInfoLib.Net/blob/master/TimeZoneInfoLib/TimeZone/UtcTimeZone.cs

这可能对您有用,或者您只是想检查一下自己的代码。它封装的其中一件事是@Brian的警告 - 因此它具有与.Kind属性相关的显式方法名称,如果.Kind错误,则会抛出有用的异常。它还可以减少获取有用/常见/夏令时名称和缩写的繁琐工作:

https://github.com/b9chris/TimeZoneInfoLib.Net/blob/master/TimeZoneInfoLib/TimeZone/TimeZoneShortNameMap.cs


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