2014-02-21 44 views
0

我试图将时间转换为不同的时区,但不是您想要的方式。例如,我需要将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

请发布任何代码,你必须执行此操作,在这一点上。 – James

+0

你的意思是像美国东部时间晚上9点到中央时间晚上8点? – AAlferez

+0

例如,根据UTC – PaulS

回答

3

如果我理解正确的问题,它的声音就像您试图将一个时区的日期/时间转换为另一个具有相同的本地时间和不同的时区的日期/时间;也就是说,在不同的时间点。

您可以通过将LocalDateTime与新区域相结合来完成此操作。例如,假设类似如下:

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

+0

,我需要将美国东部时间晚上9点(或任何区域)转换为中央晚上9点(或任何区域)。是的!谢谢你,这很棒 – PaulS

0

做MSDN上website你可以找到你所需要的。

小例子:

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

转到你想要什么的链接查看更多细节,我不能给你更多的与小描述

相关问题