使用Noda Time

时间:2016-12-19 16:03:08

标签: c# timezone nodatime

我需要导入测量数据(每小时一个数据点),并希望用noda time表示日期。该系列受到夏令时转换的影响 - 我遇到了一些问题。

我创建了一些测试日期,其中夏令时更改日期为2016年(欧洲/柏林):(年,月,日,小时)

  

2016,3,27,0
  2016,3,27,1
  2016,3,27,3
  2016,3,27,4
  2016,10,20,0
  2016,10,20,1
  2016,10,20,2
  2016,10,20,2
  2016,10,20,3

每行增加一个小时。间隙和双倍数据是夏令时转换

我使用以下代码来测试导入:

private void TestImport()
{
    List<ZonedDateTime> resultSet = new List<ZonedDateTime>();

    IDateTimeZoneProvider provider = DateTimeZoneProviders.Tzdb;
    DateTimeZone dtz = provider.GetZoneOrNull("Europe/Berlin");
    bool first = true;

    foreach (string line in File.ReadAllLines(@"C:\tmp\problemdates.txt"))
    {
        string[] split = line.Split(",".ToCharArray());
        LocalDateTime ldt = new LocalDateTime(Convert.ToInt32(split[0]), Convert.ToInt32(split[1]), Convert.ToInt32(split[2]), Convert.ToInt32(split[3]), 0);

        resultSet.Add(Convert2Zoned(ldt, dtz, ref first));
    }

    DataGrid_Results.DataContext =  return resultSet;
}


private ZonedDateTime Convert2Zoned(LocalDateTime ldt, DateTimeZone dtz, ref bool isFirstAmbigue)
{
    try
    {
        return ldt.InZoneStrictly(dtz);
    }
    catch (SkippedTimeException ex)
    {
        // rethrow
    }
    catch (AmbiguousTimeException ex)
    {
        if (isFirstAmbigue)
        {
            isFirstAmbigue = false;
            return ldt.InZone(dtz, Resolvers.CreateMappingResolver(Resolvers.ReturnEarlier, Resolvers.ThrowWhenSkipped));
        }
        else
        {
            isFirstAmbigue = true;
            return ldt.InZoneLeniently(dtz);
        }
    }
}

伊迪丝: 这是一个执行导入

的简单GUI application

我的期望 -

  

27.03。第3小时:TickOfDay 7200 ...而不是10800 ...因为这是一天中的第二个小时

     

20.10。第2小时:第二个出现的应该是TickOfDay 10800 ...而不是7200 ......再次,因为它比第一次出现晚一个小时。此外,Offset应该是+01而不是+02,因为我们再次出现在冬季。

     

我也希望LocalDateTime被“规范化”(例如1:00,2:00,3:00 ......)但是这个迁移与偏移相关......

感谢您的帮助,
弗兰克

2 个答案:

答案 0 :(得分:1)

.TickOfDayZonedDateTime上的OffsetDateTime属性与其LocalDateTime相关,这是无时区的。它与其瞬时时间点无关,而是显示的挂钟时间。

因此,您描述的期望无效。本地时间03:00始终为TickOfDay == 10800

如果您想要将这些值标准化,以便将3:00标识为当天的第二个小时,则必须先将它们全部调整为使用相同的偏移量 - 在一天的开始。

答案 1 :(得分:1)

我的时钟显示了柏林当地时间。

当我的时钟显示2016-03-27T00:00:00时,会发生某事(A)。

当我的时钟显示2016-03-27T03:00:00时会发生某事(B)。

(A)和(B)之间的经过时间是2小时。它是唯一有效的&#34;期待,因为这是事实。

问题是我们是否可以用任何软件工件表示这种有效期望。如果没有,该软件无效,而不是期望。