【问题标题】:Adjusting a DateTime to DST将日期时间调整为 DST
【发布时间】:2013-02-21 12:49:30
【问题描述】:

为了简洁明了,我有 2 台电脑:

PC 1 已关闭夏令时

PC 2 已开启 DST。

PC 1 将 DateTime 发送到 PC 2,它需要并使用它来设置其时间。

以上所有内容我都有,但我的问题是,当 PC 2 收到 DateTime 时,我如何检查它是否需要 DST 调整?

PC 位于英国。

编辑:- 更多细节以防有混淆。 当 PC 2 从 PC 1 检索时间时,它会将系统时间更改为此值,但我需要确保如果需要 +/- 1 小时 (DTS),则在设置系统日期和时间之前应用它。

【问题讨论】:

  • 使用 UTC 进行持久化和传输
  • 重新编辑:您仍然可以发送 UTC 对吗?当 UTC 时间发送到另一台 PC 时,它知道它的时区,因此它可以从众所周知的 UTC 传输转换,应用它的时区偏移量并更新时间。
  • @bryanmac 好吧,假设我将 UTC 作为 DateTime 对象接收,我只是使用它来设置系统时间还是将其转换回我猜的 GMT 时间?

标签: c# datetime timezone dst datetimeoffset


【解决方案1】:

我建议使用 UTC 进行传输和持久化。

还要注意不要将日期时间用作算法的关键部分 - 它只是数据。日期和时间会发生变化并自行纠正。我见过应用程序在 PC 更正时间时崩溃 :)

这是另一篇文章,其中包含有关该主题的更多信息: Daylight saving time and time zone best practices

【讨论】:

    【解决方案2】:

    您没有显示任何代码,但您将问题标记为,所以我将从这个角度回答。

    如果您只需要确保您谈论的是同一时间,那么使用DateTime.Kind = DateTimeKind.Utc,例如从DateTime.UtcNow 获得。

    如果您确实需要知道 PC1 认为这是一次而 PC2 认为是另一次,并且您仍然想知道这两个事物代表同一时间,请使用 DateTimeOffset。这将包括计算机的本地日期和时间,以及日期和时间表示的与 UTC 的偏移量。

    无论使用哪种方法,您都应该使用ISO8601 格式进行传输和持久化,这样无论观察者的文化或时区如何,您的意思都清晰。在 .Net 中,这是通过 .ToString("o")DateTimeDateTimeOffset 获得的。

    ISO8601 格式的 UTC DateTime 如下所示:

    2013-03-06T09:00:00Z
    

    ISO8601 格式的DateTimeOffset 如下所示:

    2013-03-06T10:00:00+01:00
    

    .Net 将此称为 Round Trip 模式 - 因为它是为您描述的确切目的而设计的。

    有关DateTimeOffset 的进一步说明 - 请参阅this post

    【讨论】:

      猜你喜欢
      • 2016-07-29
      • 2013-02-08
      • 1970-01-01
      • 2016-05-12
      • 2016-10-23
      • 2016-04-05
      • 2022-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多