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

时间:2014-02-21 21:22:24

标签: c# timezone nodatime

我正在尝试将时间转换为不同的时区,但不是你想的方式。例如,我需要将UTC时间上午9点的DateTime转换为UTC上午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

2 个答案:

答案 0 :(得分:3)

如果我正确理解了这个问题,听起来你正试图将一个时区的日期/时间转换为另一个具有相同本地时间和不同时区的日期/时间;也就是说,不同的时间点。

您可以通过将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”和“CST”不是时区:它们是时区内特定偏移的非唯一缩写; America/New_YorkAmerica/Chicago可能代表我们所谓的“东方”和“中心”,或者如果您真的想要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。如果本地时间不明确或无效(例如,在夏令时转换期间),这将throw an exception。如果这是不可接受的,您可以使用InZoneLeniently,它会在给定的当地时间或之后选择最早的有效ZonedDateTime,或InZone,这样您就可以在这些情况下指定自己的规则。

答案 1 :(得分:0)

在Msdn website上,您可以找到所需的一切。

小例子:

DateTime dateNow = DateTime.Now;
Console.WriteLine("The date and time are {0} UTC.", 
               TimeZoneInfo.ConvertTimeToUtc(dateNow));

转到链接以获取有关您想要的更多详情,我不能通过该小描述为您提供更多信息