【发布时间】:2015-11-07 05:12:32
【问题描述】:
我需要将来自服务器的“2015-11-06T18:34:07+05:30”时间戳转换为 C# 中的 DateTime 对象。然后我需要将此 DateTime 转换为 UTC 以便在同步过程中进行比较。以及时间这个时间戳中的区域可能会有所不同。那么我如何创建一个独立于时区的功能来从这个时间戳字符串中获取一个 UTC DateTime 对象。
【问题讨论】:
-
使用解析:DateTime date = DateTime.Parse("2015-11-06T18:34:07+05:30");您无需转换为 UTC。日期以 UTC 格式自动存储在 PC 中。您的日期时间包含一个时区,因此它会自动正确存储并且不需要转换。当将 DateTime 显示为字符串时,PC 将使用 PC 时区设置将 UTC 存储时间转换为本地时间。仅当您想在与本地 PC 时区设置不同的时区中显示时才进行转换。从字符串转换为 DateTime 时,在未指定时区时使用 PC 时区设置。
-
@jdweng - 不正确。如果没有标志,
DateTime.Parse会将给定的时间戳调整为用户的本地时区,而不是 UTC。您可以检查.Kind的结果,看到它会是Local。 -
马特:你说的正是我所说的。它只是看起来好像时间已调整为本地时间,但计算机中的实际存储始终是UTC。如果您更改计算机上的时区设置,计算机不会更改存储在计算机中的实际时间,只是更改其显示方式。从标准时间到夏令时时也会发生同样的情况。时间没有改变,只是时间的显示方式。
-
永远不要将 DataTime 转换为另一个 Timezone,否则会产生问题。转换一词是个问题。应始终使用捕获数据的时区输入日期时间。如果输入数据的计算机不在同一时区,请确保在输入数据时包括时区。如果您需要在不同的时区显示 DateTime 对象,那么计算机时区设置只能在不同的时区显示,切勿将 DateTime 转换为另一个时区。
-
@jdweng - 感谢您的热情,但您所说的一些事情是不正确的。不幸的是,我们对这些特定值是如何存储(文件、数据库等)一无所知——我们所知道的是,我们得到了一个 ISO8601 扩展格式的字符串,带有一个偏移量,我们将其解析为内存中的
DateTime。 .Net 中的DateTime对象确实不始终保持其UTC 值。它有一个内部长整数,它是.Ticks和.Kind的组合。刻度是自0001-01-01 00:00:00以来的 100ns 间隔数,但它们未调整为 UTC。
标签: c# datetime timezone utc timestamp-with-timezone