Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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# DST灰色地带_C#_Timezone_Dst - Fatal编程技术网

C# DST灰色地带

C# DST灰色地带,c#,timezone,dst,C#,Timezone,Dst,是否有人知道如何处理DST的灰色区域(当时间不存在时): e、 g: 给出一个错误,当 DateTime dt = new DateTime(2014,3,30,2,30,0); dt = dt.ToUniversalTime(); dt = TimeZoneInfo.ConvertTimeFromUtc(dt,tziSV); 先是1:30,然后是3:30 谢谢使用:) 这并不能减轻您思考如何处理此问题的负担,但它允许您指定如何处理此问题。从根本上说,你被赋予了一个不存在的价值。。。因此,您可

是否有人知道如何处理DST的灰色区域(当时间不存在时): e、 g:

给出一个错误,当

DateTime dt = new DateTime(2014,3,30,2,30,0);
dt = dt.ToUniversalTime();
dt = TimeZoneInfo.ConvertTimeFromUtc(dt,tziSV);
先是1:30,然后是3:30

谢谢

使用:)

这并不能减轻您思考如何处理此问题的负担,但它允许您指定如何处理此问题。从根本上说,你被赋予了一个不存在的价值。。。因此,您可以选择抛出错误,或者选择转换的开始、结束或某些自定义行为:

例如,“宽松”解析器将返回转换的结束:

using System;
using NodaTime;

class Test
{
    static void Main()
    {
        var local = new LocalDateTime(2014, 3, 30, 2, 30, 0);
        var zone = DateTimeZoneProviders.Tzdb["Europe/Paris"];

        var zoned = local.InZoneLeniently(zone);
        Console.WriteLine(zoned);  // 2014-03-30T03:00:00 Europe/Paris (+02)
    }
}
using System;
using NodaTime;
using NodaTime.TimeZones;

class Test
{
    static void Main()
    {
        var local = new LocalDateTime(2014, 3, 30, 2, 30, 0);
        var zone = DateTimeZoneProviders.Tzdb["Europe/Paris"];

        var resolver = Resolvers.CreateMappingResolver(
              ambiguousTimeResolver: Resolvers.ReturnEarlier,
              skippedTimeResolver: Resolvers.ReturnEndOfIntervalBefore);
        var zoned = local.InZone(zone, resolver);
        Console.WriteLine(zoned); // 2014-03-30T01:59:59 Europe/Paris (+01)
    }
}
或者,您可以使用内置解析器返回转换之前的值:

using System;
using NodaTime;

class Test
{
    static void Main()
    {
        var local = new LocalDateTime(2014, 3, 30, 2, 30, 0);
        var zone = DateTimeZoneProviders.Tzdb["Europe/Paris"];

        var zoned = local.InZoneLeniently(zone);
        Console.WriteLine(zoned);  // 2014-03-30T03:00:00 Europe/Paris (+02)
    }
}
using System;
using NodaTime;
using NodaTime.TimeZones;

class Test
{
    static void Main()
    {
        var local = new LocalDateTime(2014, 3, 30, 2, 30, 0);
        var zone = DateTimeZoneProviders.Tzdb["Europe/Paris"];

        var resolver = Resolvers.CreateMappingResolver(
              ambiguousTimeResolver: Resolvers.ReturnEarlier,
              skippedTimeResolver: Resolvers.ReturnEndOfIntervalBefore);
        var zoned = local.InZone(zone, resolver);
        Console.WriteLine(zoned); // 2014-03-30T01:59:59 Europe/Paris (+01)
    }
}
或者您可以构建自己的解析器(它们只是代理)


从根本上说,这取决于应用程序如何处理。没有一刀切的答案,您无法轻易避免在此处丢失数据。(好吧,除非你建立自己的数据结构,专门记住原始的本地日期/时间。)

我找到了一种通过.net工具处理灰色区域的方法

    DateTime dt = new DateTime(2014,3,30,2,30,0);
    TimeZoneInfo tziSV = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");

    if (tziSV.IsInvalidTime(dt))
    {
       dt = dt.Add(tziSV.GetUtcOffset(dt));
    }
    DateTime dtSV = TimeZoneInfo.ConvertTimeToUtc(dt,tziSV);

谢谢,乔恩,你说得对。我们之所以不能使用它,是因为存在多年的大型项目中出现了问题,并且引入另一个库并不方便。@user470071:您可能希望在
DateTime
TimeZoneInfo
上编写扩展方法,以允许相同的行为。我知道您已经找到了
IsInvalidTime
,它适合于识别它-但是您需要准确地确定您想要的行为。还请记住,夏令时不必是1小时——我认为目前夏令时无处不在,但我认为一些地方在过去观察到了“双DST”,我知道尼泊尔正在考虑75分钟的夏令时。我非常怀疑您是否要添加整个UTC偏移量。例如,在加利福尼亚州,这会将时间更改7或8小时(取决于GetUtcOffset对无效时间的处理方式)。你到底希望结果是什么?(不过,使用
IsInvalidTime
是正确的识别方法。)