ISO 8601日期时间的理解

4
我正在尝试理解ISO 8601格式的日期读取,但找不到好的文档可供阅读。
如果我在代码中获取时间如"2018-08-18T00:00:00+1000",这是本地时间还是UTC时间? 并且当我使用Convert.ToDateTime("2018-08-18T00:00:00+1000")进行转换时,我得到以下日期时间{8/17/2018 7:00:00 AM}。我不确定那是UTC时间还是本地时间?
"2018-08-18T00:00:00+1000"转换为{8/17/2018 7:00:00 AM}背后的数学原理是什么,我无法理解这一点。

+1000 在结尾表示协调世界时加 10 小时和 0 分钟。你应该查看维基百科上关于 ISO 8601 的内容。关于转换的问题,我不确定,可能是 C# 吗?我相信这样的问题已经被回答了很多次。 - Joakim Danielson
谢谢Joakim,我在阅读维基页面后提出了这个问题,但并没有得到太多帮助。我理解UTC+10小时的意思,但这是否意味着日期是本地时间还是UTC时间?另外,是的,那是C#代码,特别是当代码运行时,+10并不合理,因为它将时间向后推迟了几个小时...从2018年8月18日到2018年8月17日上午7点,明显不是+10的差异... - Sarah
1
+1000 表示该时区为 UTC + 10 小时,如果你不在这个时区,转换和使用本地时间时将得到不同的时间值。这是一个棘手的领域,很容易出错,根据你想要对日期做什么操作,最简单的方法可能是先将其转换为 UTC,然后再转换为你的本地时区。无论如何,如果你想要更多关于实际转换的帮助,请给这个问题打上 c# 标签。 - Joakim Danielson
2个回答

1
您正在询问关于将2018-08-18T00:00:00+1000显示为8/17/2018 7:00:00 AM的数学原理。
首先,8/17/2018 7:00:00 AM只是另一种显示日期和时间的格式。转换为ISO 8601字符串后,它看起来像这样:2018-08-17T07:00:002018-08-18T00:00:00+1000表示中的+1000是一个时区偏移量。您可以将该字符串解读为UTC时间加上十小时的2018年8月18日。因此,它与2018-08-18T10:00:00Z相同。
因此,我们有一个UTC日期为2018年8月18日上午10点,显示为本地日期为2018年8月17日上午7点。这意味着您所在的时区比UTC晚27小时。

据我所知,比协调世界时早12个小时(或晚14个小时)的时区不存在。因此,我认为您的示例中存在拼写错误。另一个原因可能是完全损坏的日期解析器。

但我仍然希望您能理解转换背后的数学原理。


非常感谢你的帮助,Jelhan。是的,我明白这一点,这正是我为什么感到困惑的原因,它怎么可能回溯27个小时呢?没有这样的时区,但代码却一直返回这个结果。唯一能想到的原因是,内部可能进行了一些不合理的数学计算。有可能它将8/18/18作为当地日期然后进行了一些转换。但这正是C#代码返回的结果,我无法理解。 - Sarah

0

这是我推断的方式

  • 2018-08-18T00:00:00+1000 // 用户当地时间为8月18日00:00,比协调世界时提前10小时
  • 2018-08-17T14:00:00Z // 同一时刻的协调世界时
  • 8/17/2018 7:00:00 AM // 同一时刻的服务器所在地的当地时间,比协调世界时晚7小时

现在由您的代码决定是否使用用户的+10偏移量。

请参考此链接以获取另一个示例 这些日期字符串表示相同的时间点吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接