TimeZoneInfo.ConvertTimeToUtc 问题

2024-04-03

我们遇到一个问题,一位开发人员创建了以下代码,并且该代码可以在他的 DEV 环境中运行。但是当它被签入 QA 时,代码会中断并显示以下错误消息:

myRecord.UTCStartTime = TimeZoneInfo.ConvertTimeToUtc(myRecord.StartTime, myTimeZone);

由于提供的 DateTime 无法完成转换 没有正确设置 Kind 属性。例如,当 Kind属性是DateTimeKind.Local,源时区必须是 时区信息.Local。

在我的 DEV 环境中,上述代码会生成与 QA 服务器相同的错误。我应用了以下更改来解决该问题:

DateTime utcStart = DateTime.SpecifyKind(myRecord.StartTime, DateTimeKind.Unspecified);
myRecord.UTCStartTime = TimeZoneInfo.ConvertTimeToUtc(utcStart, myTimeZone);

为什么第一个代码示例可以在 DEV1 环境中运行,但在我的 DEV 环境和 QA 服务器上却无法运行?


这取决于如何myRecord.StartTime被起源。

  • 如果你从DateTime.Now,那么它将有一个Local kind.
  • 如果你从DateTime.UtcNow那么它会有一个Utc kind.
  • 如果你从new DateTime(2013,5,1)那么它会有一个Unspecified kind.

这也取决于你在哪里得到的myTimeZone从。例如:

  • TimeZoneInfo.Local
  • TimeZoneInfo.Utc
  • TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time")

The TimeZoneInfo.ConvertTimeToUtc仅当该功能可以将区域与您指定的类型相匹配时,该功能才会运行。如果两者都是本地的,或者都是 UTC,那么它就可以工作。如果你给它一个特定的区域,那么类型应该是未指定的。这种行为是记录在 MSDN 上 http://msdn.microsoft.com/en-us/library/vstudio/bb495915.aspx.

您可以轻松一致地重现异常:

var tz = TimeZoneInfo.FindSystemTimeZoneById("Fiji Standard Time");
var utc = TimeZoneInfo.ConvertTimeToUtc(DateTime.Now, tz);

假设您不住在斐济,每次都会出错。你基本上是说,“将我在其他区域的本地时间转换为 utc” - 这是没有意义的。

它可能适用于您的开发环境,因为您正在测试的值myTimeZone恰好是开发商的本地区域。

关于你的改变 - 当然你可以强制不指定类型,这会改变你正在做的事情的含义,使其有意义。但你确定这就是你想要的吗?是什么.Kind手头的日期?如果还没有Unspecified,那么它就带有某种意图。您可能应该返回到此数据的来源并确保它是您所期望的。

如果这一切听起来疯狂、疯狂、令人沮丧和怪异,那是因为DateTime物体发臭。这里有一些补充阅读:

  • DateTime 有什么问题吗? http://noda-time.blogspot.com/2011/08/what-wrong-with-datetime-anyway.html
  • 针对 DateTime.Now 的案例 http://codeofmatt.com/2013/04/25/the-case-against-datetime-now/

您可能会考虑使用NodaTime http://nodatime.org反而。它的 API 将防止您犯这些类型的常见错误。

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

TimeZoneInfo.ConvertTimeToUtc 问题 的相关文章

随机推荐

  • struts2 异步操作

    希望使用带有 Serlvet 3 0 异步支持的 Struts2 我的第一个方法是只处理写入操作中的输出流并返回 null 然而 这会返回 404 资源不可用 我试图在 struts 操作中调整 Bosh servlet 使用 Servle
  • 更新应用程序的最佳方式

    我正在使用 WPF 技术开发游戏 我想每三天向游戏添加新功能 更新的大小对我来说很重要 我的游戏需要联网才能启动 就像网络游戏一样 另一个挑战是更新的大小 最重要的注意事项 我需要更新程序不需要停止 你的建议是什么 clickonce 是个
  • 如何将 XYSplineRenderer 图中的正方形形状更改为点

    In JFreeChart XYSplineRenderer Graph I need to display small dots instead of small squares to display XY coordinates How
  • 修改VCL组件代码

    我需要更改组件中的功能 当您收到 您无法覆盖此 消息 或者您需要更改私有方法中的代码 基类中不存在该方法 消息 导致组件无法下降时 您该怎么办 如果我遇到这个问题 我首先尝试从组件或其 CustomXXX 祖先继承 看看是否可以解决问题 如
  • 如何在_Layout视图中访问UserProfile

    在我的 MVC 应用程序中 我有一个共享的 Layout cshtml 文件 用于显示用户的菜单 在该视图上 我想显示来自 UserProfile 实体的信息 使用 SimpleMembership 创建 因此链接到可以在 Layout 页
  • 在 Cordova 应用程序中播放音频

    我正在使用 Cordova 媒体插件在我的移动应用程序中播放音频 我尝试了很多代码 但我没有弄清楚我在底部做错了什么 我放了两段我尝试过的代码 第一个代码 js代码在单独的文件中 var app initialize function th
  • Windows 7 上的 XAMPP 无法正常工作

    我刚刚在 Windows 7 上安装了 XAMPP lite 我有两个驱动器 C 用于操作系统和常规文件 以及外部驱动器 E 我在 E 根目录 上安装了 XAMPP lite 但它一直给我带来问题 Apache 工作得很好 但 MySQL
  • Apache Netbeans 10 CVS 插件不可用?

    我最终升级到 Apache Netbeans 10 从 8 2 并想像往常一样使用菜单安装 CVS 插件Tools gt Plugins gt Available Plugins 但是 我似乎无法找到 访问该插件 在 设置 中 我激活了 N
  • JQuery tablesorter pager 插件在 Edge 模式下无法与 IE11 正常工作

    如果您使用带有分页器的 Tablesorter Jquery 插件 则表上的添加将不会显示任何数据 数据就在那里 但它是隐藏的 我怀疑该插件的浏览器功能检测方法无法处理IE11 还有其他人遇到这个吗 看来IE11的userAgent有问题
  • 使用 snmp 代理注册 OID

    我正在尝试使用 snmp4j 模拟 SNMP 代理 我正在尝试向代理注册 MO 下面是代码片段 static final OID mo1 new OID 1 3 6 1 4 1 1234 1 104 static final OID mo2
  • 在 Coq 中,“if then else”允许非布尔第一个参数?

    我读过一些教程if a then b else c代表match a with true gt b false gt c end 然而 很奇怪的是 前者不检查类型a 而后者当然确保a是一个布尔值 例如 Coq lt Check if nil
  • java中的内存文件系统

    我想用Java创建一个简单的内存文件系统 它有一个根目录 并且能够创建新的子目录 在该目录中 我们可以创建新文件 写入文件 读取文件 删除文件以及重命名文件 您能否提供一些从哪里开始的建议 简单的代码或资源 自定义文件系统提供程序必须实现
  • 临时值在此语句结束时被释放[重复]

    这个问题在这里已经有答案了 我正在尝试使用 Select 箱子抓取网页 let document Document from read response unwrap for node in document find Class lia
  • HTML5 视频,如果没有 .ogv 文件,则回退到 Flash

    如果不存在必要的文件类型 如何回退到 Flash 视频播放器 例如这段代码
  • 我可以在为服务器提供 API 的同时提供静态文件吗?

    所以我对网络开发还很陌生 现在我和我更加面向网络的朋友开始了一个项目 他向我扔了各种各样的框架 我们正在做 Vuejs jade stylus 和 jeet 对于新手来说 这当然非常令人困惑 因为没有 Vuejs 示例使用 jade 没有
  • 绘制三角形 iOS

    下面的代码画了一个圆圈 我如何修改现有代码来画一个三角形 colorDotLayer CALayer layer CGFloat width self bounds size width 6 colorDotLayer bounds CGR
  • 为什么我的充电状态接收器总是返回 false?

    我试图检测用户何时插入 或拔出 设备进行充电 在我的接收器中 当我确定它是否已插入时 我总是得到 错误 的状态读数 这是我的代码 在清单中
  • 如何在 shell 中解析长格式参数?

    我所看到的一切都使用getopt或者稍微花哨一点的getopts仅支持单字符选项 例如 h但不是 help 我想做一些花哨的长选择 我做过类似的事情this http blogger ziesemer com 2010 01 dyndns
  • 带有变量的 Swift 闭包导致内存泄漏

    我正在调试我的程序 发现内存泄漏问题 在ViewController中 当它弹出时 应该调用deinit函数 但事实并非如此 所以我尝试通过以下步骤来解决这个问题 通过注释多行 我发现以下几行使得 ViewController 没有释放 v
  • TimeZoneInfo.ConvertTimeToUtc 问题

    我们遇到一个问题 一位开发人员创建了以下代码 并且该代码可以在他的 DEV 环境中运行 但是当它被签入 QA 时 代码会中断并显示以下错误消息 myRecord UTCStartTime TimeZoneInfo ConvertTimeTo