obtenir DateTimeOffset de DateTime (utc) et TimeZoneInfo
J'ai besoin de convertir DateTime+TimeZoneInfo en DateTimeOffset.
Comment dois-je faire? Je suppose que je dois passer de Temps mais alors je ne sais pas si l'heure d'été à temps seront traitées correctement..
Merci!
Mise à JOUR
TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById("Mountain Standard Time");
return new DateTimeOffset(DateTime.UtcNow, timeZone.BaseUtcOffset);
Ce code génère une exception..
Le Décalage UTC Utc DateTime
cas, il doit être 0.\r\nParameter
nom: offset
Mise à JOUR 2
Désolé, je ne savais pas que DateTimeOffset ne contient que de l'offset, il ne contient pas de réelles informations de zone - je suis donc d'accepter la réponse de @Dave que c'est ce que je vais être à l'aide de ...
Question connexe: stackoverflow.com/q/2532729/1583
Utilisation
C'est juste l'illustration du problème. Ma source de données a toutes les dates marquées en heure Utc. J'ai besoin de les convertir en différents fuseaux horaires
N'utilisez pas de
O ne comprends pas comment je peux le faire. Mon but est d'obtenir DateTimeOffset avec le BON fuseau horaire à l'intérieur de lui. Ma compréhension est que DateTimeOffset contient UTC + Fuseau horaire et c'est exactement comment je le veux. Ces données seront utilisées par la suite pour les temps d'affichage sur l'INTERFACE utilisateur
Utilisation
DateTime.Now
, pas DateTime.UtcNow
.C'est juste l'illustration du problème. Ma source de données a toutes les dates marquées en heure Utc. J'ai besoin de les convertir en différents fuseaux horaires
N'utilisez pas de
TimeZoneInfo
- il suffit de créer un nouveau TimeSpan
avec tous les champs mis à 0.O ne comprends pas comment je peux le faire. Mon but est d'obtenir DateTimeOffset avec le BON fuseau horaire à l'intérieur de lui. Ma compréhension est que DateTimeOffset contient UTC + Fuseau horaire et c'est exactement comment je le veux. Ces données seront utilisées par la suite pour les temps d'affichage sur l'INTERFACE utilisateur
OriginalL'auteur katit | 2011-06-08
Vous devez vous connecter pour publier un commentaire.
Vous devriez être sur le point d'obtenir la différence entre le type DateTime.UtcNow et DateTime.Maintenant
Si vous êtes économiser de l'offset, il est généralement bénéfique pour enregistrer toutes les dates en UTC (surtout en db) de sorte que vous n'aurez pas à traiter avec des décalages. Il vous suffit de les convertir avant de les afficher, mais le faire tous les calculs en UTC.
Edit: Si vous avez un Fuseau horaire de l'objet, vous pouvez convertir une date UTC à l'heure locale pour le fuseau horaire.
OU
Voici un exemple de code qui liste une date dans tous les fuseaux horaires.
Voir modifier ci-dessus
Ce n'est pas ce que je veux. Disons que sur votre PC, heure du centre. Je veux affichage de la date de l'heure UTC en Heure du Pacifique.
J'ai juste ajouté une option où vous pouvez prendre n'importe timezoneinfo objet et de convertir une date UTC datetime locale en fonction du fuseau horaire.
Mon but est d'obtenir DateTimeOffset objet avec la date et la zone insidie.. Puis quand je l'affiche - je vais m'en occuper séparément
OriginalL'auteur Dave Ferguson
TimeZoneInfo
a unBaseUtcOffset
bien qui est unTimeSpan
représentant le décalage.C'est le décalage que l'
DateTimeOffset
constructeurs attend:Cela semble raisonnable. Si votre
DateTime
variable est de typeLocal
, puis unTimeSpan
de0
est en effet correcte.Je reçois exception. Permettez-moi de mettre à jour de poste principal à mon code..
Je ne pense pas que cela va fonctionner si de l'heure d'été est active
OriginalL'auteur Oded
Je pense qu'il y a peut être une solution plus facile à éliminer l'erreur. Vous avez essayé:
DateTimeOffset déclenche une exception. Ce que tu voulais dire est ceci:
Ce ne sera pas jeter l'exception. Je ne sais pas pourquoi le constructeur qui accepte une plage de Temps, il existe encore, car il ne fonctionne que si elle correspond à l'locale ou utc offset donné dans l'objet DateTime. Mais il est toujours possible, avec moins de maux de tête.
OriginalL'auteur Garr Godfrey
Pour ceux d'entre nous qui travaillent avec les systèmes existants, il n'est pas toujours possible de changer la façon dont les données sont stockées. Si vous êtes seulement intéressé dans le fuseau horaire spécifique sur la machine à partir de laquelle votre code est en cours d'exécution, vous pouvez utiliser le dessous de la méthode d'extension. Il y a une conversion implicite entre DateTime et DateTimeOffset qui prend en compte la "DateTime.Nature de la propriété".
TimeZoneInfo.Local.GetUtcOffset(time).Hours
avec((DateTimeOffset)DateTime.SpecifyKind(time, DateTimeKind.Local)).Offset.Hours
pour mon Windows build, et je n'obtiens plus une exception.OriginalL'auteur rdans