gpt4 book ai didi

c# - 如何将日期正确转换为 UTC,然后再将其转换回来?

转载 作者:可可西里 更新时间:2023-11-01 08:58:10 24 4
gpt4 key购买 nike

我正在努力将 DateTime 转换为 UTC,这个概念以及所有我没有正确理解的东西。

当我得到一个日期时间字符串时,比如“7/10/2013”​​,我只是这样做

  Convert.ToDateTime("7/10/2013").ToUniversalTime();

这将在数​​据库中将其记录为“7/10/2013 4:00:00 AM ”。服务器位于美国东海岸 (-5)。当然,在 2013 年 7 月期间,仍在观察 DST,因此该时间段的偏移量为 -4,因此额外的 4 小时 4:00:00 AM "记录为 UTC。

当我写这篇文章时,现在是 2014 年 2 月,而且 DST 没有生效,所以现在的偏移量是 -5。在我的应用程序中,这是我在应用程序中选择的偏移量。

如果我申请-5偏移 “7/ 10 /2013 上午四点00分00秒”,日期将是将 “7/09 /2013 下午11时00分〇〇秒”。

哪一天错了。

问题 #1

那么我如何正确地将 UTC 时间转换回来?意思是,当用户在 2014 年 2 月加载我的应用程序时(当前时区偏移为 -5),7/10/2013 4:00:00AM 应该仍然是 7/10/2013,而不是 7/09/2013。

令我困惑的是,由于 .ToUniversalTime() 考虑了服务器 DST,是否存在不受服务器所在位置影响的硬设置“通用时间”???

问题#2

当我在西海岸和东海岸都有服务器写入数据库时​​会发生什么?应用程序如何判断记录的 UTC 时间是基于东海岸还是西海岸?

基本上,代码如何判断“7/10/2013 4:00:00 AM”是在东海岸创建的UTC时间(表示美国东海岸的7/10/2013 00:00:00AM)和不是由西海岸的服务器(这表明美国西海岸是 7/09/2013 20:00:00pm”)?

对不起,如果这听起来很愚蠢。任何建议表示赞赏。

==========最终编辑,我目前的解决方案==============

MiMo的回答是有道理的。我对两件事感到困惑。
  • 存储在数据库中的 UTC 时间对服务器意味着什么?
  • 服务器时间与应用程序用户有什么关系?

  • 我的应用程序可以被来自不同时区的用户使用,有些用户与服务器在同一时区,有些则不是。有些旅行,因此即使它们与服务器处于同一时区,它们也可能始终处于不同的时区。我的应用程序允许他们选择他们所在的时区,从而适本地反射(reflect)时间。

    最初,我只是从数据库中获取 UTC 时间并从中减去用户的时区偏移量。正如 Mimo 建议的那样,这是错误的。原因可以在我上面的帖子中看到。

    我最初的解决方案是立即获取服务器的时区偏移量并使用它来添加/减去 UTC,这也是错误的。 2013 年 7 月 10 日,当时服务器的偏移量为 -4。现在,在 2014 年 2 月,服务器时区偏移量为 -5。解决方案当然是使用 .ToLocalTime()

    在我深入研究 Mimo 关于如何使用 TimeZone.ToLocalTime() 的建议之前,以下是我临时解决该问题的方法。
  • 从数据库中获取 UTC 日期并转换为 .ToLocalTime,这是服务器显示的内容。所以对于服务器,7/10/2013 4:00:00AM 变为 7/10/2013 12:00:00AM。
  • 获取服务器时区偏移量。它目前显示 -5,因为它位于美国东海岸。
  • 获取用户的时区偏移量。对于西海岸,用户现在选择 -8。对于东海岸,用户现在选择 -5。
  • 获取用户时区和服务器时区之间的差异。西海岸是-3。东海岸是 0.
  • 减去 7/10/2013 12:00:00AM 的差值,所以西海岸的截止日期为 7/09/2013 21:00:00PM,东海岸的截止日期为 7/10/2013 12:00:00AM .

  • 全都正确。

    非常感谢各位。现在是时候深入研究 TimeZone.ToLocalTime() 并看看我是否可以减少步骤 2-5。

    最佳答案

    如果要将本地时间作为 UTC 存储在数据库中,则需要先将其转换为通用时间:

     DateTime dbDateTime = localDateTime.ToUniversalTime();
    ... store dbDateTime in the database ...

    当您从数据库中读回它时,它的 Kind 属性将设置为 Unspecified。您需要将其 Kind 属性显式设置为 UTC:
    dbDateTime = ... get from database, e.g. (DateTime) reader["SomeDateTimeColumn"]
    dbDateTime = DateTime.SpecifyKind(dbDateTime, DateTimeKind.Utc);

    如果您想将其转换为本地时间,您可以使用:
    DateTime localDateTime = dbDateTime.ToLocalTime();

    关于c# - 如何将日期正确转换为 UTC,然后再将其转换回来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21864346/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com