我需要导入测量数据(每小时一个数据点),并希望用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 ......)但是这个迁移与偏移相关......
感谢您的帮助,
弗兰克
答案 0 :(得分:1)
.TickOfDay
或ZonedDateTime
上的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;期待,因为这是事实。
问题是我们是否可以用任何软件工件表示这种有效期望。如果没有,该软件无效,而不是期望。