将相同的时间转换为不同的时区



我正在尝试将时间转换为不同的时区,但不是按照您的想法。例如,我需要将美国东部时间上午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);

nowEasternAmerica/New_York时区中的当前时间。如果我们将nowEastern直接打印到控制台,我们将看到类似2014-02-22T05:18:50 America/New_York (-05)的内容。

顺便说一句,"EST"one_answers"CST"不是时区:它们是时区内特定偏移量的非唯一缩写;America/New_YorkAmerica/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));

转到链接了解更多关于你想要什么的详细信息,我无法用的小描述给你更多

相关内容

  • 没有找到相关文章

最新更新