我正在努力将 DateTime 转换为 UTC、概念以及所有我无法正确理解的内容。
当我得到一个日期时间字符串,比如“7/10/2013”时,我只是这样做
Convert.ToDateTime("7/10/2013").ToUniversalTime();
这会将其记录为“7/10/2013凌晨 4:00:00”在数据库中。服务器位于美国东海岸(-5)。当然,2013年7月期间,仍在观察DST,因此该时间段的偏移量为-4,这样多出的4个小时凌晨 4:00:00" 记录为 UTC。
当我写这篇文章时,现在是 2014 年 2 月,夏令时尚未生效,因此现在的偏移量为 -5。在我的应用程序中,这是我在应用程序中选择的偏移量。
如果我将 -5 偏移量应用于“7/10/2013 凌晨 4:00:00”,日期将为“7/09/2013 11:00: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 时间对服务器意味着什么?
- 服务器时间与应用程序用户有什么关系?
我的应用程序可以由来自不同时区的用户使用,有些用户与服务器位于同一时区,有些则不是。有些旅行,因此即使他们与服务器位于同一时区,他们也可能始终落在不同的时区。我的应用程序允许他们选择所在的时区,从而适当地反映时间。
最初,我只是从数据库中获取 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。