我已经阅读了这里的多个帖子,直到我的脑袋准备爆炸, 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 回答
在
DateTimeOffset
或TimeZoneInfo
之前尝试DateTime.SpecifyKind(rangeStart, DateTimeKind.Unspecified)
. 它不应该对时间进行任何转换,只需更改Kind
即可 .据我了解,
Kind
上的Kind
应该是Unspecified
或对应于私有TimeZoneInfo.GetCorrespondingKind()
方法的结果,该方法为TimeZoneInfo.Local
返回Local
,为TimeZoneInfo.Utc
返回Utc
.更新:抱歉,原来的答案错了,现在应该都很好 .