【发布时间】:2014-03-18 19:56:12
【问题描述】:
我正在努力将 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 4:00:00 AM”,则日期将为“7/09 /2013 11:00:00PM”。
哪一天错了。
问题 #1
那么我该如何正确地转换 UTC 时间呢?意思是,当用户现在在 2014 年 2 月加载我的应用程序时(当前时区偏移为 -5),2013 年 7 月 10 日凌晨 4:00:00 应该仍然是 2013 年 7 月 10 日,而不是 2013 年 7 月 9 日。
让我感到困惑的是,由于 .ToUniversalTime() 考虑了服务器 DST,是否存在不受服务器位置影响的硬设置“通用时间”????
问题 #2
当我在西海岸和东海岸都有服务器写入数据库时会发生什么?应用程序如何判断记录的 UTC 时间是基于东海岸还是西海岸?
基本上,代码如何判断“7/10/2013 4:00:00 AM”是在东海岸创建的 UTC 时间(表示美国东部为 7/10/2013 00:00:00AM海岸)而不是西海岸的服务器(这表明美国西海岸是 2013 年 7 月 9 日晚上 20:00:00”)?
对不起,如果这听起来很愚蠢。任何建议表示赞赏。
==========最终编辑,我目前的解决方案===============
MiMo 的回答很有道理。我对两件事感到困惑。
- 存储在数据库中的 UTC 时间对服务器意味着什么?
- 服务器时间与应用用户有什么关系?
我的应用程序可供来自不同时区的用户使用,有些用户与服务器处于同一时区,有些则不在。有些旅行,因此即使它们与服务器处于同一时区,它们也可能始终处于不同的时区。我的应用程序允许他们选择他们所在的时区,从而适当地反映时间。
最初,我只是从数据库中获取 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。
减去与 2013 年 7 月 10 日上午 12:00:00 之间的差异,因此西海岸的截止日期为 2013 年 7 月 9 日下午 21:00:00,东海岸的截止日期为 2013 年 7 月 10 日中午 12:00:00。
全部正确。
非常感谢各位。现在是时候深入研究 TimeZone.ToLocalTime() ,看看我是否可以减少步骤 2-5。
【问题讨论】:
-
考虑将时间(对象)放在一边,仅以 UTC 显示时间。
-
保存日期/时间的列的 SQL 数据类型是什么?
标签: c# asp.net .net datetime utc