首页 文章

为什么从一个时区转换到另一个时区这么难?

提问于
浏览
2

我已经阅读了这里的多个帖子,直到我的脑袋准备爆炸, Map 上遍布的 Map 上只有很少的线条 .

这是我想要做的:

  • 我有一个日历,其中包含要为企业显示的约会 .

  • 该业务在纽约(EDT)

  • 我的开发机器在PST

  • 生产环境 服务器位于加利福尼亚州(PST)

  • 日历数据以UTC格式存储在数据库中

我想做的就是选择在EDT指定的时间范围(例如5月15日,上午9点 - 下午5点),并在日历上显示所有约会 .

所以,我的日历控件告诉我“我希望约会时间为5月15日上午9点 - 美国东部时间5月15日下午5点”我说得很好,我会调用db proc并以UTC格式传递日期值,即(5) / 15/12 13:00 UTC - 5/15/12 21:00 UTC) . 然后,当我得到它们时,我会将它们转换回EDT,然后再交给你 .

但是,Little我知道.NET会发现这个简单的任务让我失望 .

我使用以下方法获得TimeZoneInfo就好了:

TimeZoneInfo zoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")

但事情就是这样 .

这是我接下来尝试的内容:

DateTime rangeStartUTC = TimeZoneInfo.ConvertTimeToUtc(rangeStart, zoneInfo);

EXCEPTION: Kind is not properly specified.

(WTF好吗?)我告诉你我想转换的时间,我告诉你它是在EDT,我告诉你我想把它转换成UTC . 你还想要什么?我可以手工完成 . F **已经做到了 .

所以我尝试设置Kind,但它只有两个值!本地或Utc . 但我的时间既不是本地的,也不是Utc . 为什么你到底在问我时区信息呢?你不能通过询问系统时钟告诉当地时区是什么?可以预见的是,两者都没有奏效 . (是的,根据文档有UnSpecified,但再次根据文档,它并没有真正做任何事情,是的,我也尝试过那个) .

然后,我试过:

TimeZoneInfo.ConvertTime(rangeStart, zoneInfo, TimeZoneInfo.Utc)

同样可以享受!

是时候阅读一些St. Jon Skeet的段落了 .

你知道吗,有一个新类DateTimeOffset . 它将解决您的所有问题 . 上帝保佑所有美好而仁慈的.NET 4.0赏金......

DateTimeOffset offStartTime = new DateTimeOffset(rangeStart, zone.GetUtcOffset(rangeStart));
rangeStartUTC = offStartTime.UtcDateTime;

EXCEPTION: "Offset should be 0 for Utc dates"

Gaaaaah!你怎么知道rangeStart是Utc?我有没有告诉过你?

一群人引用TimeZoneInfo.ConvertTime(rangeStart,zone)作为解决方案,它是如何“善良”为他们工作的?除非他们的源时区方便地恰好与他们的当地时区相同 .

那么什么是可怜的.NET C#开发人员呢?

1 回答

  • 2

    DateTimeOffsetTimeZoneInfo 之前尝试 DateTime.SpecifyKind(rangeStart, DateTimeKind.Unspecified) . 它不应该对时间进行任何转换,只需更改 Kind 即可 .

    据我了解, Kind 上的 Kind 应该是 Unspecified 或对应于私有 TimeZoneInfo.GetCorrespondingKind() 方法的结果,该方法为 TimeZoneInfo.Local 返回 Local ,为 TimeZoneInfo.Utc 返回 Utc .

    更新:抱歉,原来的答案错了,现在应该都很好 .

相关问题