为什么从一个时区转换到另一个时区如此困难



我在这里通读了多篇文章,直到我的头准备好爆炸,到处都是地图集上的小线条。

这是我想做的:

  1. 我有一个日历,里面装满了企业的约会。
  2. 业务位于纽约(美国东部时间(
  3. 我的开发计算机采用太平洋标准时间
  4. 生产服务器位于加利福尼亚州 (PST(
  5. 日历数据以 UTC 格式存储在数据库中

我要做的就是采用 EDT 中指定的时间范围(例如 5 月 15 日上午 9 点至下午 5 点(,并在日历上显示所有约会。

因此,我的日历控件告诉我"我希望从美国东部时间 5 年 15 月 15 日上午 9 点 - 美国东部时间 12 年 5 月 15 日下午 5 点进行约会"我说好的,我将调用数据库进程并以 UTC 格式传递日期值,即(5/15/12 13:00 UTC - 5/15/12 21:00 UTC(。然后当我得到它们时,我会将它们转换回 EDT,然后再将它们交给您。

但是,我几乎不知道.NET会发现这个简单的任务会绊倒我。

我通过使用以下方法很好地获得了时区信息:

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

但这是事情所行之有效的。

这是我接下来尝试的:

DateTime rangeStartUTC = TimeZoneInfo.ConvertTimeToUtc(rangeStart, zoneInfo);
EXCEPTION: Kind is not properly specified. 

(WTF是善良的?我告诉你我想转换的时间,我告诉你它是在EDT,我告诉你我想把它转换为UTC。你还想要什么?我可以手工完成。已经做到了。

所以我尝试设置 Kind,但它只有两个值!本地或 UTC。但我的时间既不是本地的,也不是 Utc。那你到底为什么要问我要时区信息呢?您不能通过询问系统时钟来判断本地时区是什么吗?可以预见的是,两者都没有奏效。(是的,根据文档有未指定,但同样根据文档,它并没有真正做任何事情,是的,我也尝试过那个(。

然后,我尝试了:

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

同样蹩脚的借口!

是时候阅读更多圣乔恩·斯基特的段落了。

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

DateTimeOffset offStartTime = new DateTimeOffset(rangeStart, zone.GetUtcOffset(rangeStart));
rangeStartUTC = offStartTime.UtcDateTime;
EXCEPTION: "Offset should be 0 for Utc dates"

嘎嘎!你到底是如何得出结论,范围开始是 Utc?我有没有告诉过你?

一群人在引用TimeZoneInfo.ConvertTime(rangeStart,zone(作为解决方案,它如何"善良"到足以为他们工作?除非它们的源时区恰好与本地时区相同。

那么一个糟糕的.NET C#开发人员该怎么办呢?

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

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

更新:对不起,弄错了原来的答案,现在应该都好了。

相关内容

  • 没有找到相关文章

最新更新