【发布时间】:2019-10-03 20:14:47
【问题描述】:
我有一个日志文件,其中包含格式如下的日期/时间字符串:
2019/10/01 15:30
如您所见,字符串不包含任何时区信息。但是,我确实知道时间所在的时区。
如果我在我自己的 PC 上使用这个 C# 代码,它的本地时区设置正确,时间会按预期解析。我希望将本地时间转换为 UTC 以插入数据库。
Time.ParseExact("2019/10/01 15:30", "yyyy/MM/dd HH:mm", provider, DateTimeStyles.AdjustToUniversal & DateTimeStyles.AssumeLocal);
但是,如果我在我的一个 Docker 主机上运行此代码,它的时区设置为 UTC,则时间将被解析为 UTC。这是有道理的,因为在 Docker 主机上使用 UTC AssumeLocal 将与 UTC 相同。
由于夏令时,仅应用手动偏移是不够的。此外,其中一些日志是历史的,可以追溯到 DST 更改之前,因此即使使用算法也会很复杂,而且似乎应该已经解决了(即给定日期和时区,确定它是否在 DST 中与否,然后相应地调整为 UTC)
我想要做的是明确指定时间戳的时区,并让框架同时使用给定的时区和实际日期来正确地将时间转换为UTC。我查看了this question 和this question,但它们似乎都取决于系统本身设置为您想要假设日期所在的时区。
第二个问题似乎开始解决假设已知时区的问题,但随后响应只是在解析时间上使用GetUtcOffset 来确定偏移时间的时间量。这假定时间已经在所需的时区解析。
【问题讨论】:
-
provider设置为什么?另外,我假设您的意思是DateTime.ParseExact? -
这是您要找的吗? docs.microsoft.com/en-us/dotnet/api/… 编辑:我看错了,我看到你的机器不一定会在你想要的时区。不过,您可能仍会发现使用 docs.microsoft.com/en-us/dotnet/api/… 指定 TimeZone 有一些用处。
标签: c# datetime timezone date-conversion