我正在尝试将时间转换为不同的时区,但不是按照您的想法。例如,我需要将美国东部时间上午9点的DateTime转换为UTC的CST上午9点。时区是可变的,所以仅仅增加/减少小时似乎不是NodaTime 的正确方法
Fri, 21 Feb 2014 21:00:00 EST = 1393034400 Epoch Timestamp
convert to
Fri, 21 Feb 2014 21:00:00 CST = 1393030800 Epoch Timestamp
如果我正确理解这个问题,听起来就像你试图将一个时区中的日期/时间转换为另一个具有相同本地时间和不同时区的时间;也就是说,一个不同的时间点。
您可以通过将LocalDateTime
与新区域组合使用"Noda Time"来执行此操作。例如,给定如下内容:
Instant now = SystemClock.Instance.Now;
DateTimeZone eastern = DateTimeZoneProviders.Tzdb["America/New_York"];
ZonedDateTime nowEastern = now.InZone(eastern);
nowEastern
是America/New_York
时区中的当前时间。如果我们将nowEastern
直接打印到控制台,我们将看到类似2014-02-22T05:18:50 America/New_York (-05)
的内容。
顺便说一句,"EST"one_answers"CST"不是时区:它们是时区内特定偏移量的非唯一缩写;America/New_York
和America/Chicago
可能代表了我们所认为的"东部"one_answers"中部"(或者,如果你真的想要EST,即使在夏令时生效的情况下,你也可以使用类似UTC-05:00
的东西)。
给定任何时区中的ZonedDateTime
,我们可以将其转换为具有相同本地时间和指定时区的ZonedDateTime
,如下所示:
DateTimeZone central = DateTimeZoneProviders.Tzdb["America/Chicago"];
ZonedDateTime sameLocalTimeCentral = nowEastern.LocalDateTime.InZoneStrictly(central);
这为我们提供了一个具有相同本地时间但不同时区的ZonedDateTime
。有了上面的输入,结果将是2014-02-22T05:18:50 America/Chicago (-06)
。
请注意,我使用的是InZoneStrictly
。如果本地时间不明确或无效(例如,在夏令时转换期间),这将引发异常。如果这是不可接受的,您可以使用InZoneLeniently
,它在给定的本地时间当天或之后选择最早的有效ZonedDateTime
,或者使用InZone
,它允许您在这些情况下指定自己的规则。
在Msdn网站上,您可以找到所需的一切。
小示例:
DateTime dateNow = DateTime.Now;
Console.WriteLine("The date and time are {0} UTC.",
TimeZoneInfo.ConvertTimeToUtc(dateNow));
转到链接了解更多关于你想要什么的详细信息,我无法用的小描述给你更多