我正在尝试将时间转换为不同的时区,但不是你想的方式。例如,我需要将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
答案 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_York
和America/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));
转到链接以获取有关您想要的更多详情,我不能通过该小描述为您提供更多信息