解构 ZonedDateTime

Deconstructing ZonedDateTime

使用 NodaTime,我希望解构 ZonedDateTime 以便将其保存到 SQL 数据库。在我看来,有几种选择。我可以将它解构为 InstantDateTimeZone 并将其保存为 datetime2nvarchar(50)。我可以将其解构为 DateTimeOffsetDateTimeZoneLocalDateTimeDateTimeZone,无论哪种情况,都将其保存为 datetimeoffsetnvarchar(5)

是否有区别,或者有理由选择一个而不是另一个?

我唯一能想到的是 datetimeoffset 加上 nvarchar(50) 可能会更好,以防数据库被不具有强大时区的服务读取 ->偏移量转换系统为 NodaTime。在那种情况下,我至少捕获了偏移量,在那个时区,在那个时间点,它丢失了(或者需要从历史时区信息重新计算) datetime2 加上 nvarchar(50)方法。

我还遗漏了其他注意事项吗?

我建议使用 datetimeoffset 和一个单独的时区 ID。我假设 datetimeoffset 仍然允许您执行总排序(即即时)- 尽管我认为这 可能 效率低于存储datetime2。它也可能在数据库中占用更多 space,因为它存储了更多数据。

即使数据库被有时区转换操作的服务读取,将偏移量存储在数据库中允许您根据本地对数据执行查询日期,例如“显示我星期二的所有约会”。如果你只有瞬间,你不能纯粹在数据库端执行该查询。

如果要存储未来的 date/time 值,您可能需要考虑的另一件事是预测的时区偏移量可能会因规则的变化而变化。如果您的原始输入数据是本地 date/time(如果您使用 ZonedDateTime 通常是这种情况),那么 datetimeoffset 方法将存储“用户给您的内容”加上推断的偏移量 - 如果需要,您可以轻松地使用更高版本的时区数据库更新所有数据。如果您只有计算出的瞬间,则需要在将其调整为“新”时区数据库之前计算出原始本地 date/time 在“旧”时区数据库中的内容。这也可能丢失了信息,例如如果输入值过去是不明确的(因此您选择了一个偏移量或另一个)但现在不再是。