2017-08-26 96 views
0

我使用的是帶時區(東部標準時間)的日期(1/1/2018 11:30 AM)並將其轉換爲UTC日期(2018-01-01T16:30) :00Z)。原始日期實際上是Eastern Daylights Savings,因此當開發人員使用UTC進行轉換時,他們將在12:30 PM而不是11:30 AM。如果我做8/26/2018 11:30上午,它工作正常。我的時區是.NET Windows格式。日期爲UTC時未考慮到夏令時

有沒有一種方法與我下面的方法來獲得正確的UTC時間標準與NodaTime夏令時?

2018-01-01T16:30:00Z = Helper.GetUtcTimeZone("1/1/2018 11:30 AM", "Eastern Standard Time").ToString(); 

方法

public static Instant GetUtcTimeZone(DateTime dateTime, string timeZone) 
{ 
    var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeZone ?? TimeZoneInfo.Local.StandardName); 

    if (timeZoneInfo != null) 
    { 
     if (dateTime.Kind == DateTimeKind.Unspecified) 
     { 
      dateTime = TimeZoneInfo.ConvertTimeToUtc(dateTime, timeZoneInfo); 
     } 
    } 

    return Instant.FromDateTimeUtc(dateTime); 
} 

回答

1

如果你想繼續使用TimeZoneInfo,只需直接使用它。不需要您添加的所有額外邏輯。

public static Instant GetUtcTimeZone(DateTime dateTime, string timeZone) 
{ 
    TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeZone); 
    DateTime utcDateTime = TimeZoneInfo.ConvertTimeToUtc(dateTime, timeZoneInfo); 
    return Instant.FromDateTimeUtc(utcDateTime); 
} 

雖然真的,但一旦您使用NodaTime,就沒有理由這樣做。只要使用其內置的功能:

public static Instant GetUtcTimeZone(DateTime dateTime, string timeZone) 
{ 
    LocalDateTime ldt = LocalDateTime.FromDateTime(dateTime); 
    DateTimeZone tz = DateTimeZoneProviders.Bcl[timeZone]; 
    return ldt.InZoneLeniently(tz).ToInstant(); 
} 

一個重要的提示:您曾跌倒,回TimeZoneInfo.Local.StandardName。這是不安全的 - 因爲StandardName字段是本地化的,並且即使在英文中也不總是與標識符的名稱匹配。如果您需要標識符,請使用Id而不是StandardName。在NodaTime中,您可以使用DateTimeZoneProviders.Bcl.GetSystemDefault()

+0

另請注意,您提供的第一個日期是* January *,因此它不能在EDT中。 –