2017-08-26 2 views
0

J'utilise une date (1/1/2018 11:30 AM) avec le fuseau horaire (heure normale de l'Est) et la convertir en date UTC (2018-01-01T16: 30 : 00Z). La date d'origine est vraiment Eastern Daylights Savings, donc quand les développeurs font une conversion avec l'UTC, ils obtiennent 12h30 au lieu de 11h30. Si je fais 8/26/2018 11:30 AM, ça marche bien. Mes fuseaux horaires sont dans les formats Windows .NET.Date à laquelle l'UTC ne tient pas compte de l'heure d'été

Y a-t-il un moyen avec ma méthode ci-dessous pour obtenir l'UTC correct qui a l'heure d'été à partir du fuseau horaire qui est Standard avec NodaTime?

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

Méthode

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); 
} 

Répondre

1

Si vous souhaitez continuer à utiliser TimeZoneInfo, il suffit d'utiliser directement. Pas besoin de toute la logique supplémentaire que vous avez ajoutée.

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

Bien que vraiment, une fois que vous utilisez NodaTime, il n'y a aucune raison pour cela. Il suffit d'utiliser la fonctionnalité intégrée:

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

Une note importante: Vous avez eu une retombée à TimeZoneInfo.Local.StandardName. Ce n'est pas sûr - comme les champs StandardName sont localisés, et ne correspondent pas toujours aux noms des identifiants, même en anglais. Utilisez Id au lieu de StandardName si vous attendez un identifiant. Dans NodaTime, vous pouvez utiliser DateTimeZoneProviders.Bcl.GetSystemDefault().

+0

Notez également que la première date que vous avez indiquée est * Janvier *, donc elle ne peut pas être en EDT. –