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

标签 c# datetime timezone datetimeoffset

我已经阅读了这里的多篇文章,直到我的头准备爆炸,图册上的小线条散落各处。

这就是我想做的:

  1. 我有一个日历,里面满是要显示的企业约会。
  2. 公司位于纽约(东部夏令时间)
  3. 我的开发机器采用 PST
  4. 生产服务器位于加利福尼亚州 (太平洋标准时间)
  5. 日历数据以 UTC 时间存储在数据库中

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

所以,我的日历控件告诉我“我想要从 2012 年 5 月 15 日上午 9 点(美国东部时间)到 2012 年 5 月 15 日下午 5 点(美国东部时间)的约会” 我说好吧,我将调用 db proc 并传递 UTC 格式的日期值,即(2012 年 5 月 15 日 13:00 UTC - 2012 年 5 月 15 日 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 时间。那你到底为什么要问我时区信息呢?难道你不能通过询问系统时钟来判断本地时区是什么吗?可以预见的是,两者都不起作用。 (是的,根据文档,有 UnSpecified,但根据文档,它并没有真正做任何事情,是的,我也尝试过)。

然后,我尝试了:

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"

嘎啊啊! 你到底是怎么得出 rangeStart 是 Utc 的结论的?我有告诉过你吗?

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

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

最佳答案

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

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

更新:抱歉,原来的答案错误,现在应该一切都好了。

关于c# - 为什么从一个时区转换到另一个时区如此困难?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10543319/

相关文章:

c# - 在 Windows 机器上用 C# 从 SMBus 读取值的简单方法?

python - Bokeh 自动填充日期时间轴缺失值 : how to stop it?

mysql - 从不完整的日期推断年份

c# - 我应该连接到仅基于主节点的 redis 集群吗?

c# - 当设置为异步时,是否有人在使用 Ctrl-R、T 运行特定的本地突出显示的测试时遇到问题?

java - 日期格式化后以小写形式显示 AM 和 PM

ios - 如何显示带有日期的时区缩写

google-app-engine - App Engine 的配额会影响 DST 吗?

javascript - 阅读时刻完整时区名称

c# - 仅显示 DateTime 中的日期