首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DST灰色地带

DST灰色地带
EN

Stack Overflow用户
提问于 2014-02-26 20:26:09
回答 2查看 137关注 0票数 3

是否有人知道如何处理DST的灰色地带(当时间不存在时):例如:

代码语言:javascript
复制
DateTime dt = new DateTime(2014,3,30,2,30,0);
TimeZoneInfo tziSV = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");
DateTime dtSV =TimeZoneInfo.ConvertTimeToUtc(dt,tziSV);

给出错误,当

代码语言:javascript
复制
DateTime dt = new DateTime(2014,3,30,2,30,0);
dt = dt.ToUniversalTime();
dt = TimeZoneInfo.ConvertTimeFromUtc(dt,tziSV);

1:30然后3:30。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-27 06:31:41

我找到了一种通过.net设施来处理这个灰色地带的方法

代码语言:javascript
复制
    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);
票数 0
EN

Stack Overflow用户

发布于 2014-02-26 20:32:37

使用野田时间 :)

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

例如,“宽大”解析器将返回过渡结束:

代码语言:javascript
复制
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)
    }
}

或者您可以使用内置的解析器返回“就在”转换之前:

代码语言:javascript
复制
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)
    }
}

或者您可以构建自己的解析器(他们只是代表)。

从根本上讲,这取决于您的应用程序如何处理这个问题。这里没有一刀切的答案,你也很难避免在这里丢失数据。(当然,要想记住原始的本地日期/时间,就必须构建自己的数据结构。)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22052506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档