C#: Faire en sorte DateTime.Maintenant retourne une GMT + 1 heure
Je suis en utilisant DateTime.Now
montrer quelque chose en fonction à la date d'aujourd'hui, et pour le travail local (Malte, Europe), les heures s'affichent correctement (évidemment en raison de la Zone de Temps) mais bien sûr quand je le télécharge sur mon serveur d'hébergement (états-unis), DateTime.Now
ne représente pas le bon fuseau horaire.
Donc, dans mon code, comment puis-je convertir DateTime.Now
correctement de retour le temps d'une GMT + 1 fuseau horaire ?
OriginalL'auteur Andreas Grech | 2009-07-10
Vous devez vous connecter pour publier un commentaire.
Utiliser le TimeZoneInfo de classe dans le Système.De base;
Vous devez définir la DateTimeKind à DateTimeKind.Utc pour cela.
Seulement si vous êtes en utilisant .Net 3.5 si!
OriginalL'auteur ThePower
Cela dépend de ce que tu veux dire par "un GMT + 1 fuseau horaire". Voulez-vous dire en permanence UTC+1, ou voulez-vous dire UTC+1 ou UTC+2 en fonction de l'heure d'été?
Si vous êtes en utilisant .NET 3.5, utilisez
TimeZoneInfo
pour obtenir un fuseau horaire, puis utilisez:Vous aurez besoin de travailler sur le système d'identification de l'Malte fuseau horaire, mais vous pouvez le faire facilement en exécutant ce code en local:
À en juger par vos commentaires, ce bit sera hors de propos, mais juste pour les autres...
Si vous êtes pas à l'aide .NET 3.5, vous aurez besoin de travailler sur l'heure d'été vous-même. Pour être honnête, la plus facile façon de le faire est d'aller à une simple table de recherche. Travailler sur les modifications d'heure d'été pour les prochaines années, puis d'écrire une méthode simple pour retourner le décalage d'un certain temps UTC avec la liste codé en dur. Vous pourriez juste voulez triés
List<DateTime>
avec les changements connus, et alternent entre 1 et 2 heures jusqu'à ce que votre date est postérieure à la dernière modification:Oups, merci. Le bizarre c'est que j'ai fait valider dans un premier temps - puis les ai fait à l'envers de toute façon!
Votre solution est de lancer cette exception dans le ConvertTimeFromUtc méthode: La conversion n'a pu être effectué car le DateTime ne pas avoir le Genre bien défini correctement. Par exemple, lorsque le Type de la propriété est DateTimeKind.Local, la source de fuseau horaire doit être TimeZoneInfo.Locaux. Nom du paramètre: sourceTimeZone
Êtes-vous sûr que vous êtes en passant il DateTime.UtcNow plutôt que de DateTime.Maintenant?
oui, je suis l'aide de votre extrait de code (évidemment modifier l'id de "W. Norme de l'Europe de l'Heure")
OriginalL'auteur Jon Skeet
Je ne pense pas que vous pouvez définir une propriété dans votre code qui permettra de faire DateTime.Retournez maintenant à autre chose qu'à l'heure actuelle de l'ordinateur dans lequel le code est exécuté. Si vous voulez avoir un moyen d'obtenir un autre temps, vous aurez probablement besoin de les envelopper dans une autre fonction. Vous pouvez vous pouvez faire l'aller-retour sur l'UTC et ajouter le décalage souhaité:
(exemple de code mis à jour après Luc commentaire sur le fonctionnement interne de type DateTime.Maintenant)
DateTime.UtcNow.AddHours(1)
au lieu de cela vous fera économiser de la saisie!Oui, j'ai réalisé que. Mais je ne suis pas sûr qu'ils font exactement la même chose; UtcNow récupère l'heure du système et effectue des opérations avec des "nombres magiques", tandis que ToUniversalTime utilise le Fuseau horaire.CurrentTimeZone pour obtenir l'heure Utc. Je suppose qu'ils renverra toujours le même temps ;o)
DateTime.Now
utiliseUtcNow
derrière les scènes, de sorte que votre code d'origine se traduit par quelque chose commeDateTime.UtcNow.ToLocalTime().ToUniversalTime().AddHours(1)
.Tellement vrai; ne pense pas à ce sujet. Merci pour le tuyau. Mettra à jour la réponse. Je n'ai pas peur de taper, mais lorsque le code est inefficace comme ça, c'est une autre affaire.
(En passant, je pense que le premier nombre magique utilisé dans
UtcNow
est de convertir deFILETIME
- tiques depuis 01/01/1601 - àDateTime
- tiques depuis 01/01/0001. Le deuxième nombre magique est un masque utilisé en interne pour signifierDateTimeKind.Utc
.)OriginalL'auteur Fredrik Mörk