Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .net为夏季dst增加了一小时_C#_.net_Web Services_Dst - Fatal编程技术网

C# .net为夏季dst增加了一小时

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

我从一个web服务中获得以下字符串
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

    这表明web服务正在使用GMT标准时间作为时区

  • 您希望从日期和时间字符串中提取GMT时间戳

  • 但是,在您和web服务之间有一些未指定的web服务代理(我假设是某种.NET框架?)在你的代码中,你只能访问
    日期时间
    ,而且你的代码是在中欧标准时区执行的,在夏季和冬季基本上比格林尼治标准时间提前一个小时,如果我们忽略夏时制和夏时制之间的过渡时间短的话

  • 我希望到目前为止我是正确的

    您可以使用以下代码将传入的
    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

    这表明web服务正在使用GMT标准时间作为时区

  • 您希望从日期和时间字符串中提取GMT时间戳

  • 但是,在您和web服务之间有一些未指定的web服务代理(我假设是某种.NET框架?)在你的代码中,你只能访问
    日期时间
    ,而且你的代码是在中欧标准时区执行的,在夏季和冬季基本上比格林尼治标准时间提前一个小时,如果我们忽略夏时制和夏时制之间的过渡时间短的话

  • 我希望到目前为止我是正确的

    您可以使用以下代码将传入的
    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
    ,但由于某些原因,它在