【发布时间】:2020-08-18 22:44:06
【问题描述】:
我目前正在编写一个工具来解析具有自定义、非标准文件格式的文件。 这些文件包含多个带有时间戳的测量点的数据(每 30 秒一次测量)。这些时间戳位于 CET / CEST 时区,这意味着当时间从夏季时间更改为冬季时间时,文件中将有多个具有相同时间戳的测量,因为在 2:00 和 3:00 之间的每个时间戳Morning 将在文件中存在两次(一个来自更改时间之前,一个来自更改时间之后)。
我已经能够从文件中解析出我需要的所有时间戳数据(年、月、日、小时和分钟),但我还需要将其转换为 UTC。 .NET Framework 或第 3 方库中是否有任何功能可以进行此转换?
我已经尝试过使用TimeZoneInfo.ConvertTimeToUtc,但我已经需要一个我还不知道如何创建的 DateTime 对象。
我不能简单地使用 DateTime 构造函数之一创建一个新的 DateTime 对象,因为可以说我提供了一个时间戳,由于从夏季时间到冬季时间的变化,我提供了一个在文件中存在两次的时间戳 - 它如何知道时间戳是否来自之前还是时间变了?
我认为在处理时间戳时这可能是一个比较常见的问题,但我还没有找到任何好的解决方案来解决我的问题。为了将时间正确转换为 UTC,我是否需要手动跟踪文件中时间更改的时间?如果是这样,我该怎么做?
更新: 这是我要解决的问题的一个非常简化的示例: 这可能是我的工具从文件中的时间戳解析的一些数据:
Day: 27 - Month: 10 - Year: 2019 - Hour: 1 - Minute: 45 - Second: 0
Day: 27 - Month: 10 - Year: 2019 - Hour: 2 - Minute: 0 - Second: 0
Day: 27 - Month: 10 - Year: 2019 - Hour: 2 - Minute: 15 - Second: 0
Day: 27 - Month: 10 - Year: 2019 - Hour: 2 - Minute: 30 - Second: 0
Day: 27 - Month: 10 - Year: 2019 - Hour: 2 - Minute: 45 - Second: 0
Day: 27 - Month: 10 - Year: 2019 - Hour: 2 - Minute: 0 - Second: 0
Day: 27 - Month: 10 - Year: 2019 - Hour: 2 - Minute: 15 - Second: 0
Day: 27 - Month: 10 - Year: 2019 - Hour: 2 - Minute: 30 - Second: 0
Day: 27 - Month: 10 - Year: 2019 - Hour: 2 - Minute: 45 - Second: 0
Day: 27 - Month: 10 - Year: 2019 - Hour: 3 - Minute: 0 - Second: 0
Day: 27 - Month: 10 - Year: 2019 - Hour: 3 - Minute: 15 - Second: 0
Day: 27 - Month: 10 - Year: 2019 - Hour: 3 - Minute: 30 - Second: 0
(实际上每小时有更多的数据,但这对于示例来说并不重要)
在本例中,由于夏令时到此结束,因此我们将时钟从凌晨 3:00 调回一小时到 2:00,因此我们从 CEST 更改为 CET。 大约 6 个月后(显然也早于 6 个月),当夏令时开始并且时钟向前移动一小时时,相反的事情发生了。
在我的工具解析的文件中没有任何迹象表明时间戳是在 CET 还是 CEST 中,因此我的解析逻辑需要处理这个问题。 我基本上有一个循环,它遍历文件中的行,解析时间戳,然后调用这个函数来获取每个时间戳的 DateTime 对象:
private static DateTime toDateTimeUTC(int year, int month, int day, int hour, int minute, int second)
{
// ToDo
return new DateTime(year, month, day, hour, minute, second, DateTimeKind.Utc); // This is WRONG!
}
到目前为止,这段代码显然不能正常工作,因为它只是假设时间戳是 UTC。
【问题讨论】:
-
您能否提供一些示例时间戳(来自您的文件)和您的解析逻辑?
-
@PeterCsala 为什么?我从 CET / CEST 时间戳解析了年、月、日、分和秒,我需要从中创建一个 UTC DateTime 对象。文件结构和解析逻辑与我要解决的问题有什么关系?我不想详细介绍文件结构,因为它非常复杂且令人困惑。
-
@Chris - 您可能需要使用其他
TimeZoneInfo方法,包括IsAmbiguousTime和GetAmbiguousTimeOffsets,以及您自己的消歧逻辑。很乐意在这里为您提供帮助,但是对于此类问题,我们确实需要查看一些数据和代码才能为您提供帮助。如果您现有的代码太复杂,请提供说明您的问题的代码。请阅读 Stack Overflow 帮助中心的 How to create a Minimal, Reproducible Example。谢谢。 -
(至少提供您正在使用的数据的示例,这样人们就不必猜测了。)
-
@MattJohnson-Pint 我刚刚更新了问题并添加了一个示例。如果有帮助,请告诉我。