【问题标题】:DateTime versus Two Time Zones?日期时间与两个时区?
【发布时间】:2015-07-22 20:10:20
【问题描述】:

我有一个存储事件的数据表。事件以当地时间保存。我正在开发一个表单,用户在其中输入过去的日期和时间。在多次填写表格后,我需要获取这些日期和时间,并找出在这些时间发生的事件。

问题在于用户输入的是他们的当地时间,而不是我的。我可以添加偏移量或时区选择。但后来我意识到,日光节约时间会让事情变得不起作用。

我无法更改我的数据表日期和时间值。我可以在哪里将他们的日期和时间转换为我的,同时考虑夏令时?

谢谢

【问题讨论】:

  • 您是否考虑过以 UTC 格式存储日期。意思是,让用户以 UTC 格式为您提供日期并将其存储在 UTC(在 sqlserver 中)并基于 UTC 进行搜索。
  • 可能会更容易询问用户他们的本地时间和时区,然后在后端转换为 UTC。取决于用户群的复杂程度。但我确实同意 UTC 是要走的路。

标签: c# sql-server vb.net tsql


【解决方案1】:

前提:我真的认为解决问题的理想方法是将存储的日期时间转换为 UTC,然后在搜索时使用它。

但是你说你不能改变它们,所以在请求时使用ConvertTime 转换它们可能是你最好的第二选择。

  • Here你可以找到你需要的所有细节。
  • 您可能还想看看Noda Time,它在处理 TimeZones 和 DateTime 时非常有用。

【讨论】:

    【解决方案2】:

    由于您将活动时间存储为当地时间,因此您总是会遇到夏令时问题。对于时间重叠的事件,无法判断该事件是第一次发生还是第二次发生本地时间具有该值的时间。通过将信息存储为当地时间,您已经丢失了信息。如果您将事件时间存储为 UTC,则可以避免夏令时问题。

    如果不更改您存储的数据,就不可能解决夏令时问题。您可以做的最好的是将时间从用户的时区转换为 UTC,然后再转换为您的本地时间。示例:

    TimeZoneInfo TimeZone = TimeZoneInfo.GetSystemTimeZones().Where(t => t.StandardName == "W. Europe Standard Time").Single();
    DateTime utc = TimeZoneInfo.ConvertTimeToUtc(inputTime);
    DateTime local = utc.ToLocalTime();
    

    【讨论】:

      【解决方案3】:

      也许像 MyDateTime.ToLocalTime() 这样的东西对你有用?

      看看下面的文章,它应该会有所帮助。 https://msdn.microsoft.com/en-us/library/ms973825.aspx

      【讨论】:

        猜你喜欢
        • 2020-11-18
        • 2021-05-20
        • 2010-10-25
        • 2017-12-18
        • 1970-01-01
        • 2018-01-03
        • 1970-01-01
        • 1970-01-01
        • 2014-11-22
        相关资源
        最近更新 更多