如果我使用 DateTimeOffset 存储所有日期,我仍然需要始终将日期转换为 UTC,还是仅使用 DateTimeOffset 会更有效?
最佳答案
答案是 - 这取决于情况。
DateTimeOffset
是时间戳 + UTC 偏移量。问题是多个时区可以共享相同的偏移量,但它们可能不共享相同的夏令时规则(除其他外),并且自DateTimeOffset
以来没有任何时区的概念,这会导致歧义。但是,如果您存储服务器端时间戳,则这可能没问题,这些时间戳不会显示给用户并且用户没有与之交互。我猜这可能是服务器端日志记录的一个例子。
恕我直言,处理用户输入、用户可见、用户可查询等时间戳时最安全的方法是存储 DateTime
s 并存储完整的时区信息。您可以使用TimeZoneInfo.Serialize(...)
,它将完整的时区信息输出到一个字符串并将其保存在数据库中,稍后您可以通过 TimeZoneInfo.Deserialize(...)
将其反序列化为 TimeZoneInfo 实例。并用于转换DateTime
本地/UTC 日期时间。它是安全的,因为没有歧义,而且即使时区发生变化(确实如此 - 例如 DST 变化),您的数据仍然是一致的。当然,您需要注意更新数据库以保持同步(非常罕见)。
通过上述方法,您可以将日期时间保存为 UTC 或本地日期,您必须根据用例决定使用哪一种。在 UTC 中存储日期和时间时,一件有趣的事情是用户的“今天”的概念变得稍微复杂一些 - 您可以在我的博客 here 上阅读相关内容。 .
关于asp.net-mvc - 为时区敏感应用程序存储 DateTimeOffset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6320568/