2017-08-26 14 views
0

タイムゾーン(東部標準時)と日付(2010年1月1日午前11時30分)を使用しており、それをUTC日付(2018-01-01T16:30 :00Z)。元の日付は実際にEastern Daylight Savingsです。したがって、開発者がUTCで変換を行うと、11:30 AMの代わりに12:30 PMになります。私が8/26/2018 11:30 AMをしたら、うまくいきます。私のタイムゾーンは.NET Windows形式です。夏時間を考慮しないDate to UTC

NodaTimeで標準のタイムゾーンからの夏時間の正しいUTCを取得する方法はありますか?

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フィールドはローカライズであり、英語でも識別子の名前と必ずしも一致するとは限らないため、安全ではありません。識別子が必要な場合は、StandardNameの代わりにIdを使用してください。 NodaTimeでは、DateTimeZoneProviders.Bcl.GetSystemDefault()を使用できます。

+0

あなたが与えた最初の日付は* 1月*であることに注意してください。そのため、EDTには入れることはできません。 –

関連する問題