C# .net为夏季dst增加了一小时
我从一个web服务中获得以下字符串C# .net为夏季dst增加了一小时,c#,.net,web-services,dst,C#,.net,Web Services,Dst,我从一个web服务中获得以下字符串2013-10-15T12:54:18+01:00。这个日期是夏季DST,我的.NET代码(我想是web服务代理)会自动增加一个小时。如果返回值在冬季DST内下降,则情况不同。返回的时间(12:54:18)是我想要显示的时间,我不想进行任何形式的重新计算 我正在使用TimeSpan DateTime.TimeOfDay来显示时间 我能做些什么来实现这一点?您可能需要检查哪些描述了您的TimeOfDay当前返回的转换 通过检查那篇文章,你可以找到纠正它的方法。Ti
2013-10-15T12:54:18+01:00
。这个日期是夏季DST,我的.NET代码(我想是web服务代理)会自动增加一个小时。如果返回值在冬季DST内下降,则情况不同。返回的时间(12:54:18
)是我想要显示的时间,我不想进行任何形式的重新计算
我正在使用TimeSpan DateTime.TimeOfDay
来显示时间
我能做些什么来实现这一点?您可能需要检查哪些描述了您的TimeOfDay当前返回的转换
通过检查那篇文章,你可以找到纠正它的方法。TimeZoneInfo是您需要的类
编辑,Jon Skeet提供的工作可能也会有所帮助,查看更多信息 您可能需要检查哪个描述了您的TimeOfDay当前返回的转换
通过检查那篇文章,你可以找到纠正它的方法。TimeZoneInfo是您需要的类
编辑,Jon Skeet提供的工作可能也会有所帮助,查看更多信息 在这种示例中,DateTime对象不包含偏移量。它只保存
种类
,可以是本地偏移量(运行时环境的偏移量)或UTC。这样做,因为DateTimeOffset是您想要的:
DateTimeOffset test = DateTimeOffset.Parse("2013-10-15T12:54:18+01:00");
Console.WriteLine(test.DateTime.TimeOfDay); // UTC
Console.WriteLine(test.LocalDateTime.TimeOfDay); // Localized with the offset parsed
将输出
12:54:18
11:54:18
在这种示例中,DateTime对象不包含偏移量。它只保存
种类
,可以是本地偏移量(运行时环境的偏移量)或UTC。这样做,因为DateTimeOffset是您想要的:
DateTimeOffset test = DateTimeOffset.Parse("2013-10-15T12:54:18+01:00");
Console.WriteLine(test.DateTime.TimeOfDay); // UTC
Console.WriteLine(test.LocalDateTime.TimeOfDay); // Localized with the offset parsed
将输出
12:54:18
11:54:18
我正试图把你的问题和其他评论的片段放在一起。到目前为止,我的分析如下:
- 没有夏令时(冬季),字符串是
2013-12-30T12:54:18
- 夏令时(夏季)的字符串是
2013-10-15T12:54:18+01:00
日期时间
,而且你的代码是在中欧标准时区执行的,在夏季和冬季基本上比格林尼治标准时间提前一个小时,如果我们忽略夏时制和夏时制之间的过渡时间短的话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)转换而来如果我的分析正确,这就是问题的根源。
另一种解释方式是:
| Server (GMT) | Framework (CET) | My code
-------+---------------+---------------------------+----------------------------
Summer | +01:00 suffix | GMT -> CET adds 1 hour | CET -> GMT subtracts 1 hour
-------+---------------+---------------------------+----------------------------
Winter | No suffix | Assumed to be CET | CET -> GMT subtracts 1 hour
我已经尽量保持代码的通用性,但实际上它只是试图修复缺少+00:00
的情况,在这种情况下,destinationTimeZoneInfo.BaseUtcOffset
正好是0,所以这样做可能有点过火
更重要的是,我不确定这段代码在夏令时转换期间是否提供了正确的结果。尽管我相信GMT和CET在同一日期的转换,CET仍然比GMT早一个小时。你真的必须创建一些单元测试,以确保你得到期望的结果。我正试图把你的问题和附加评论的部分放在一起。到目前为止,我的分析如下:
- 没有夏令时(冬季),字符串是
2013-12-30T12:54:18
- 夏令时(夏季)的字符串是
2013-10-15T12:54:18+01:00
日期时间
,而且你的代码是在中欧标准时区执行的,在夏季和冬季基本上比格林尼治标准时间提前一个小时,如果我们忽略夏时制和夏时制之间的过渡时间短的话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
,但由于某些原因,它在