2

我已经阅读了这里的多个帖子,直到我的头准备好爆炸,地图集上到处都是小线条。

这是我想做的事情:

  1. 我有一个充满约会的日历来显示一个企业。
  2. 公司位于纽约 (EDT)
  3. 我的开发机器在 PST
  4. 生产服务器位于加利福尼亚 (PST)
  5. 日历数据以 UTC 格式存储在数据库中

我想要做的就是在 EDT 中指定一个时间范围(比如 5 月 15 日上午 9 点到下午 5 点)并在日历上显示所有约会。

所以,我的日历控件告诉我“我想要从 5/15/12 上午 9 点 EDT - 5/15/12 下午 5 EDT”我说好的,我将调用一个 db proc 并以 UTC 传递日期值,即(5 /15/12 13:00 UTC - 5/15/12 21:00 UTC)。然后,当我拿到它们时,我会将它们转换回 EDT,然后再交给你。

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

通过使用,我得到了 TimeZoneInfo:

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

但这只是事情的结果。

这是我接下来尝试的:

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

EXCEPTION: Kind is not properly specified. 

(WTF 是 Kind 吗?)我告诉过你我想转换的时间,我告诉过你它是 EDT,我告诉过你我想将它转换为 UTC。你还想要什么?我可以用手做。他妈的已经这样做了。

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

然后,我尝试了:

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"

啊啊啊!你到底是怎么断定 rangeStart 是 Utc 的?我有告诉过你吗?

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

那么,一个可怜的 .NET C# 开发人员该怎么办呢?

4

1 回答 1

2

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

据我了解,KindonDateTime应该是Unspecified或者对应于私有TimeZoneInfo.GetCorrespondingKind()方法的结果,该方法返回Localfor TimeZoneInfo.LocalUtcfor TimeZoneInfo.Utc

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

于 2012-05-10T23:55:31.730 回答