0

我正在尝试将时间转换为不同的时区,但不是您的想法。例如,我需要将美国东部标准时间上午 9 点的日期时间转换为 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
4

2 回答 2

4

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

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”和“CST”不是时区:它们是时区内特定偏移量的非唯一缩写;America/New_York并且America/Chicago可能代表我们认为的“东部”和“中部”(或者UTC-05:00即使在夏令时生效时,如果你真的想要 EST,你也可以使用类似的东西)。

给定ZonedDateTime任何时区的a,我们可以将其转换为ZonedDateTime具有相同本地时间和指定时区的a,如下所示:

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,它允许您在这些情况下指定自己的规则。

于 2014-02-22T10:43:34.057 回答
0

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

小例子:

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

转到链接以获取有关您想要的更多详细信息,我无法用那个小描述为您提供更多信息

于 2014-02-21T21:34:25.687 回答