我正在尝试将您的问题和其他 cmets 拼凑在一起。到目前为止,这是我的分析:
-
在网络上,您会看到两个不同的日期和时间字符串:
这表明 Web 服务使用 GMT 标准时间 作为时区。
您想从日期和时间字符串中提取 GMT 时间戳。
但是,在您和 Web 服务之间存在一些未指定的 Web 服务代理(我假设是某种 .NET 框架?)并且在您的代码中您只能访问 @ 987654323@ 以及您的代码在 中欧标准时间 时区执行,如果我们忽略往返转换的短暂时间,该时区在夏季和冬季基本上都比格林威治标准时间早一小时夏令时。
我希望到目前为止我是正确的。
您可以使用此代码将传入的DateTime 转换为 GMT:
// Framework code creates the DateTime.
var sourceDateTime = DateTime.Parse("2013-10-15T12:54:18+01:00");
// Application code can further process the DateTime.
var destinationTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
var destinationDateTime = TimeZoneInfo.ConvertTime(sourceDateTime, destinationTimeZoneInfo);
这个例子在夏令时给出了正确的答案。传入的日期和时间字符串包含一个偏移量,并被正确解析为本地时区 (CET)。 TimeZoneInfo.ConvertTime 假定源 DateTime 在本地时区,结果是正确的。
但是,代码在没有夏令时的冬季失败:
var sourceDateTime = DateTime.Parse("2013-12-30T12:54:18");
请注意,日期和时间字符串不再包含时区偏移量。偏移量是+00:00,但由于某种原因,它在字符串中丢失了。这意味着假定源 DateTime 位于本地时区 (CET) 中,而不是从实际时区 (GMT) 转换而来。 如果我的分析是正确的,这就是你问题的根源。
另一种解释方式:
|服务器 (GMT) |框架 (CET) |我的代码
--------+---------------+------------------------- -+----------------------------
夏季 | +01:00 后缀 | GMT -> CET 增加 1 小时 | CET -> GMT 减去 1 小时
--------+---------------+------------------------- -+----------------------------
冬季 |无后缀 |假定为 CET | CET -> GMT 减去 1 小时
这个问题没有简单的解决方法。如果您可以说服 Web 服务提供正确的偏移量,即使它是 +00:00,我上面的代码也适用于夏季和冬季。更好的是,仅使用 UTC 并且仅在最终用户参与时转换为本地时间。但我猜你无法控制网络服务?
一种选择是在与服务器相同的时区(例如 GMT)中执行您的代码。那么你应该可以直接使用时间戳而无需任何转换。
另一个更难看的选择是确定网络服务是否在夏令时之外,然后相应地调整时间:
var destinationTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
if (!destinationTimeZoneInfo.IsDaylightSavingTime(sourceDateTime)) {
var sourceDateTimeOffset = new DateTimeOffset(sourceDateTime, destinationTimeZoneInfo.BaseUtcOffset);
sourceDateTime = sourceDateTimeOffset.UtcDateTime;
}
var destinationDateTime = TimeZoneInfo.ConvertTime(sourceDateTime, destinationTimeZoneInfo);
我试图使代码尽可能通用,但实际上它只是试图修复缺少+00:00 的情况,在这种情况下destinationTimeZoneInfo.BaseUtcOffset 正好为 0,所以这样做可能有点矫枉过正这个。
更重要的是,我不确定这段代码在夏令时转换期间能否提供正确的结果。尽管我相信 GMT 和 CET 在同一日期转换 CET 仍然比 GMT 早一小时。您确实必须创建一些单元测试以确保获得所需的结果。