如何将日期正确转换为 UTC 然后再转换回来?

2024-03-17

我正在努力将 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的回答很有道理。我对两件事感到困惑。

  1. 存储在数据库中的 UTC 时间对服务器意味着什么?
  2. 服务器时间与应用程序用户有什么关系?

我的应用程序可以由来自不同时区的用户使用,有些用户与服务器位于同一时区,有些则不是。有些旅行,因此即使他们与服务器位于同一时区,他们也可能始终落在不同的时区。我的应用程序允许他们选择所在的时区,从而适当地反映时间。

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

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

在深入研究 Mimo 关于如何使用 TimeZone.ToLocalTime() 的建议之前,我先介绍一下我临时解决该问题的方法。

  1. 从数据库中获取 UTC 日期并转换为服务器显示的 .ToLocalTime。因此对于服务器来说,7/10/2013 4:00:00AM 变为 7/10/2013 12:00:00AM。

  2. 获取服务器时区偏移量。目前显示 -5,因为它位于美国东海岸。

  3. 获取用户的时区偏移量。对于西海岸,用户现在选择-8。对于东海岸,用户现在选择 -5。

  4. 获取用户时区和服务器时区之间的差异。西海岸是-3。东海岸为0。

  5. 减去 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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将日期正确转换为 UTC 然后再转换回来? 的相关文章

  • 如何配置 IIS 以接受 POST 请求?

    我知道默认情况下 IIS 不接受发布请求 如何更改此设置 有人可以引导我改变这个 一步一步 吗 如果您使用的是 IIS 6 及更低版本 在 IIS 管理屏幕中右键单击您的网站或虚拟目录 去Properties然后去Home Director
  • 防止 boost::asio::io_context 在空轮询调用时停止

    此代码调用发布的句柄 boost asio io context ioc boost asio post ioc std cout lt lt lol lt lt std endl ioc poll 而这并没有 boost asio io
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 如何在 SqlDataReader.Read() 期间从死锁异常中恢复

    我的 NET 应用程序的事件日志显示 它在从 Sql Server 读取数据时偶尔会出现死锁 这种情况通常非常罕见 因为我们已经优化了查询以避免死锁 但有时仍然会发生 过去 我们在调用ExecuteReader函数在我们的SqlComman
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • Visual Studio Code:如何配置 includePath 以获得更好的 IntelliSense 结果

    我是使用 Visual Studio Code 的完全初学者 我不知道我在做什么 我已经四处搜索 也许还不够 但我找不到像我这样的人如何配置的简单解释c cpp properties json每当我单击带有绿色波浪线下划线的行旁边的黄色灯泡
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • 在 ASP.NET 3.5 中使用 ASMX 文件的 WS-Security

    基本上 我需要设置 ASMX 文件 以便当我在浏览器中将其拉出以显示 WebMethod 规范时 Soap 标头符合以下格式
  • 检查 RoutedEvent 是否有任何处理程序

    我有一个自定义 Button 类 当单击它时 打开特定窗口 它总是执行相同的操作 我添加了一个可以在按钮的 XAML 中分配的 Click 事件 就像常规按钮一样 当它被单击时 我想执行 Click 事件处理程序 如果已分配 否则我想执行默
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • Azure CloudTable 线程安全吗?

    我正在使用 Storage SDK 2 0 从不同线程 ASP NET 应用程序 写入 Azure 表存储 Is 云表 object 线程安全 我是否可以仅初始化 CloudStorageAccount CloudTableClient 和
  • 是否有相当于 Clang/LLVM 的 .spec 文件,在哪里可以找到参考?

    The gcc驱动程序可以配置为使用特定的链接器 特定的选项和其他细节 例如覆盖系统头 specs files 当前 截至撰写本文时 GCC 版本 4 9 0 的手册此处描述了规范文件 https gcc gnu org onlinedoc
  • 我可以让 ungetc 取消阻止阻塞的 fgetc 调用吗?

    我想在收到 SIGUSR1 后使用 ungetc 将 A 字符重新填充到标准输入中 想象一下我有充分的理由这样做 调用 foo 时 stdin 中的阻塞读取不会被收到信号时的 ungetc 调用中断 虽然我没想到它会按原样工作 但我想知道是
  • 根据所选单选按钮启用文本框

    我有一个单选按钮列表 其中列出了不同的业务类别 最后一个选项是Other类别 当用户选择Other类别 我希望能够启用一个文本框 用户可以输入更多信息来解释Other选择 目前 我正在尝试 If rblCategory SelectedIn
  • 使用taskkill停止Windows服务

    我需要帮助来使用 C 终止 Windows 服务 现在要终止该服务 请使用以下选项 从命令 sc queryex ServiceName 发现后PID服务的 taskkill pid 1234 exemple f 为了便于阅读 但如果您明白
  • 更改 Windows Phone 系统托盘颜色

    有没有办法将 Windows Phone 上的系统托盘颜色从黑色更改为白色 我的应用程序有白色背景 所以我希望系统托盘也是白色的 您可以在页面 XAML 中执行此操作
  • 将 char[][] 转换为 char** 会导致段错误吗?

    好吧 我的 C 有点生疏了 但我想我应该用 C 来做我的下一个 小 项目 这样我就可以对其进行抛光 并且我已经有不到 20 行的段错误了 这是我的完整代码 define ROWS 4 define COLS 4 char main map
  • C++0x中disable_if在哪里?

    Boost 两者都有enable if and disable if 但 C 0x 似乎缺少后者 为什么它被排除在外 C 0x 中是否有元编程工具允许我构建disable if按照enable if 哦 我刚刚注意到std enable i

随机推荐

  • 将点击事件绑定到 jQuery Datatable on() 中的 tr 元素不起作用

    我正在开发一个包含所有用户的表 也可以通过单击表行并在单击执行后打开的表单中编辑数据来更改该表 如果我在页面加载时加载了所有用户 我的代码就可以正常工作 一旦我更改数据表以在数据表初始化时加载用户 它将仅在第一页上工作 如果我取消注释我的下
  • 当子类化 Ruby 哈希时,如何重写 []= 方法?

    我有一个扩展哈希的类 我想跟踪哈希键何时被修改 覆盖的正确语法是什么 key 语法方法来完成这个 我想插入我的代码 然后调用父方法 这可以用 C 方法实现吗 我从文档中看到底层方法是 rb hash aset VALUE hash VALU
  • Plone 工作流程的圣杯

    我们正在实施 Plone CMS 作为 ISO9001 文档的存储库 ISO 要求一定量的日志记录 任何熟悉该标准的人都可能知道 为了灵活性 我们希望合并 不按特定顺序 新的内容类型 需要合并企业中可能出现的不同文档 版本控制 表明我们的文
  • Maven 程序集插件在 jenkins 中重新下载依赖项

    由于某种原因 每次我尝试使用 Jenkins 构建项目时 maven 似乎都在尝试下载项目的依赖项 有一些问题 第一个是它根本不应该这样做 另一个问题是它甚至没有尝试从正确的存储库下载它们 这意味着它必须等待它们中的每一个都超时 我可以自己
  • 如何使geom_bar中的闪避与geom_errorbar、geom_point中的闪避一致

    我有一个数据集 其中在不同日期对不同组进行测量 我想要并排的条形图代表不同组在不同日期的测量值 条形图组根据测量日期间隔 并在它们上面覆盖误差条 我在躲避时遇到了麻烦geom bar同意闪避geom errorbar 这是一段简单的代码 d
  • 基于int数组创建WritableRaster

    我需要获取一个 int 数组并将其转换为 BufferImage 我真的对这个主题没有任何背景 我都是从互联网上学到的 所以这就是我想要做的 从 BufferedImage done 创建一个数组 将该数组转换为 IntBuffer don
  • TabIndex 无法正常工作的可能原因是什么

    所以我从 0 开始 为表单上的控件定义 tabindex 但在运行时一切都搞砸了 形式有点复杂 它有水平和垂直的分割器和面板 组框和一些旧的 VB 6 0 activeX 控件 它们内部是一个树控件 即使我以编程方式执行此操作并读取prev
  • 接口中的协变返回类型未通过 Javac 编译

    我有以下结构 public interface BarReturn public interface FooReturn public interface FooBarReturn extends FooReturn BarReturn p
  • 无法在 firebase 云函数中创建自定义令牌,因为服务帐户没有必要的权限

    打电话时admin auth createCustomToken 我收到以下错误 需要 iam serviceAccounts signBlob 权限才能对服务帐户项目 serviceAccounts k 执行此操作 电子邮件受保护 cdn
  • 使用 #!/usr/bin/php 时自定义 php.ini

    我有一个脚本 我试图在其中加载自定义php ini文件 该脚本通过以下方式在 nix 系统上运行 usr bin php qc path to php ini标头 然而 当这样做时 PHP 报告加载的php ini文件不存在 即没有加载 如
  • 在 ondrag 事件期间,pageX 和 pageY 在 Firefox 中始终设置为 0

    我正在实现一个可视化编辑器 允许用户将图像拖动到页面上 并将其他图像拖动到这些先前拖动的图像中 类似于 添加另一个图像 我基本上只需要拖动过程中的鼠标坐标 元素 hiliting 等 我使用基于这些坐标的自定义函数 问题是 在 Webkit
  • 升级 @ngrx/Store 时,“Action”类型上不存在属性“payload”

    我有 ngrx store打包在我的 Angular 4 x 应用程序中 并从 v 升级2 2 2 gt v4 0 0 我可以看到迁移注释说 Payload 属性已从 Action 接口中删除 然而 他们给出的例子似乎完全违反直觉 在我看来
  • 整个网页使用一个文件的优点和缺点? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我不知道该怎么表达 但我会尝试一下 我最近开始用面向对象的 PHP 编写我的作品集 我想知道使用内容根据 SQL 数据和 GET 变量
  • 如何从 Android Fragment 禁用或隐藏抽屉布局

    我的应用程序中有 10 个不同的片段 我需要在几个片段中隐藏导航抽屉 抽屉布局 如何从片段访问抽屉布局并隐藏它 我知道我们需要在活动中使用mDrawerLayout setDrawerLockMode DrawerLayout LOCK M
  • VS 2010无法打开源文件“字符串”

    突然之间 我的 VS 2010 项目中的 Intellisense 开始变得疯狂 一切都正确构建 但它无法再找到基本的 C 头文件 如字符串 映射等 它不再识别 std 命名空间 而且通常会变得混乱 代码仍然可以编译 但无论我做什么 我都无
  • 服务器宕机时移动 SVN 存储库

    我的 SVN 服务器死了 我有另一台可以用作 SVN 服务器的机器 还有几台带有原始存储库的工作副本的机器 是否有一种干净的方法可以仅从当前工作副本在新服务器上重新创建存储库 历史是可以被遗忘的 我尝试创建一个新的存储库 破解其 UUID
  • 如何将字符串与整数进行比较

    In SQL Server 2012 我有一组列定义为VARCHAR 这些值是指标的阈值 可以是数字或字符串值 例如 温度的阈值是数字0 and 100 而门的阈值是open and closed 我想测试一个值 ResponseValue
  • 如何使 new FormData() 在 IE 浏览器上工作

    我怎样才能让这个在 IE 上工作 这在 IE 上不起作用 IE 浏览器不支持 new FormData api 是否有其他 api 相当于 IE 中的 new FormData var fd new FormData fd append u
  • Google Apps Script V8 分配给 null 会取消调试

    将变量赋值为 null 会导致调试取消该行的执行 这是重现该问题的测试脚本 function myFunction var a Hallo Logger log a a var b null Logger log b b 调试时 此脚本执行
  • 如何将日期正确转换为 UTC 然后再转换回来?

    我正在努力将 DateTime 转换为 UTC 概念以及所有我无法正确理解的内容 当我得到一个日期时间字符串 比如 7 10 2013 时 我只是这样做 Convert ToDateTime 7 10 2013 ToUniversalTim