【问题标题】:NodaTime: Instant to ZonedDateTime without skewing timeNodaTime:即时到 ZonedDateTime,没有时间偏移
【发布时间】:2020-03-24 12:06:12
【问题描述】:

我有一个日期时间存储在我们的后端系统中,例如2019-11-27T00:00:00。 我现在想使用该数据,无论时区如何,都代表日期和时间,作为发送给外部用户的 JSON 文档的一部分。

我目前正在使用 Noda Time 类型Instant 来表示上述值。

InstantPattern.CreateWithInvariantCulture("yyyy-MM-ddTHH:mm:ss").Parse("2019-11-27T00:00:00").Value;

当我稍后想在 JSON 文档中输出时间时,我想将其转换为也可以表示当前对象时区的类型。时区是已知的。

例如,以上值在文档中应该这样表示:
瑞典2019-11-27T00:00:00+01:00
芬兰2019-11-27T00:00:00+02:00

我想这样做的原因是数据库中的日期和时间表示当前数据消费者在本地时间发生事件的时间。一个例子是“黑色星期五”销售,从销售所在的实际国家/地区的午夜开始,而不是在 UTC 或类似的午夜出现时。通过在输出 JSON 中设置时区信息,我可以保证数据的消费者获得正确的信息。

我从 Instant 使用 ZonedDateTime 的所有尝试,Instant 被视为 UTC 时间并且输出变得不正确。我可能缺少一些东西,但不幸的是我被卡住了。

我的问题是:

  • NodaTime 是正确的库吗?
  • Instant 是数据库值的正确数据类型吗?
  • ZonedDateTime 是正确的工作方式吗?
  • 如何将 Instant 转换为任何其他可以包含 TimeZone 信息的类型?

提前致谢。

【问题讨论】:

  • 为了清楚起见:+01:00 不是“时区”。这是一个偏移量。大多数情况下,这将是等价的,但它相同。但是关于主题:如果您想在数据库中划分时间戳,为什么不将区域(或偏移量)与它一起存储?
  • 感谢您澄清偏移量。我不希望数据库中的分区数据,因为一个对象在 10 个国家/地区有效。对象有效的时间开始于例如 2019-11-27T00:00:00。这是关于国家/地区的不同 UTC 时间。在瑞典是 2019-11-26T23:00:00Z,在芬兰是 2019-11-26T22:00:00Z
  • 您可以使用TimeZoneInfo.ConvertTimeBySystemTimeZoneId 方法生成一个DateTimeOffset(因为时区是已知的)。 JSON 适用于 DateTimeOffset 对象。如果 TimeZone 只是偏移量,则可以使用 DateTimeOffset 方法添加它。
  • 作为我身边的母亲澄清。数据源自大型框架 ERP。 ERP 中的数据在全球范围内有效,正如我们常说的“此商品可从 11 月 27 日午夜开始销售”。 11月27日午夜发生在该国。所以这家商店即使可以在瑞典或英国销售,也无法在芬兰销售该商品。
  • 吉米:感谢您的意见。这给了我想要的输出!谢谢!

标签: c# datetime nodatime


【解决方案1】:

从上面一些伟大的人的 cmets 中,我已经解决了我的问题

  • 使用 Instant 作为数据库中的类型,以防止其他开发人员将其误认为是本地日期和时间
  • 将 Instant 转换为 DateTime,然后及时应用 TimeZoneInfo.ConvertTimeBySystemTimeZoneId 以创建 JSON 输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 2018-08-12
    • 2020-03-15
    • 1970-01-01
    • 2021-07-26
    相关资源
    最近更新 更多