2016-11-17 2 views
1

je convertir une chaîne qui représente un temps dans le fuseau horaire du Pacifique que j'utilise pour créer un objet DateTime:TimeZoneInfo.ConvertTime de PST à UTC à AEST - hors d'une heure

var pacificDateTime = new DateTime(2016, 11, 16, 15, 0, 0) // 11/16/2016 3:00:00 PM 

En utilisant, je créer un DateTimeOffset parce que finalement, il devient un peu plus facile de travailler avec.

var pacificTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); 
var dateTimeNoKind = new DateTime(pacificDateTime.Ticks, DateTimeKind.Unspecified) 
var DateTimeOffsetValue = TimeZoneInfo.ConverTimeToUtc(dateTimeNoKind, pacificTimeZoneInfo) // 11/16/2016 11:00:00 PM 

Jusqu'ici tout va bien. La différence entre UTC et Pacific est que l'UTC est en avance de 8 heures (l'heure est à l'heure d'été).

Ensuite, je veux convertir UTC à AEST, mais c'est là le problème apparaît:

var australianEasternTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time"); 
TimeZoneInfo.ConvertTime(DateTimeOffsetValue, australianEasternTimeZoneInfo) // 11/17/2016 10:00:00 AM 

AEST est en avance sur UTC de 10 heures. Je m'attendais à ce que la valeur soit 11/17/2016 09:00:00 AM mais au lieu de cela je reçois une heure supplémentaire ajoutée à mon résultat. En tant que test, lorsque je convertis en PST ou GMT ou EST à partir de l'heure UTC, ils semblent se reconvertir correctement. J'ai l'impression qu'il me manque quelque chose d'évident ou que je néglige quelque chose de simple?

+0

AEST est actuellement UTC + 11, pas UTC + 10. Nous sommes en plein jour. 'TimeZoneInfo.FindSystemTimeZoneById (" AUS Eastern Standard Time ") IsDaylightSavingTime (DateTime.UtcNow)' – Rob

+1

@Rob réellement AEST est toujours UTC + 10, c'est juste l'Australie ne l'observe pas actuellement mais AEDT. – zerkms

+1

@zerkms Vous avez raison - c'est une distinction que j'ai oubliée. Cependant, '' "AUS Eastern Standard Time" 'est mappé en interne à la même zone, avec un' DaylightName' et 'StandardName' – Rob

Répondre

4

De Time in Australia article de Wikipedia:

Australian Time Zones

L'Australie a deux fuseaux horaires de l'Est. Dans le nord-est, UTC + 10 s'applique toute l'année. Dans le sud-est, UTC + 10 s'applique pendant l'heure normale, et UTC + 11 s'applique pendant l'heure diurne (aka l'heure d'été).

La région nord-est (Queensland) utilise l'identifiant de fuseau horaire IANA "Australia/Brisbane", tandis que la région sud-est (Nouvelle-Galles du Sud) utilise "Australia/Sydney". Ces correspond aux identificateurs de fuseau horaire Windows: "E. Australia Standard Time" et "AUS Eastern Standard Time" respectivement.

  • Si vous convertissez pour Queensland, utilisez "E. Australia Standard Time".

  • Si vous convertissez pour la Nouvelle-Galles du Sud, utilisez "AUS Eastern Standard Time".

Quant à la nature confusion de ces identifiants, voir la section sur les fuseaux horaires Windows dans the timezone tag wiki.

Si vous souhaitez utiliser les identificateurs IANA standard, utilisez Noda Time.