J'essaie de créer un test unitaire pour tester le cas où le fuseau horaire change sur une machine parce qu'il a été mal défini puis corrigé.
Dans le test, je dois être en mesure de créer des objets DateTime dans un fuseau horaire non local pour m'assurer que les personnes exécutant le test peuvent le faire avec succès, quel que soit leur emplacement.
D'après ce que je peux voir du constructeur DateTime, je peux définir la zone horaire pour qu'elle soit le fuseau horaire local, le fuseau horaire UTC ou non spécifié.
Comment créer un DateHeure avec un fuseau horaire spécifique tel que PST?
Réponses:
La réponse de Jon parle de TimeZone , mais je suggérerais d'utiliser TimeZoneInfo à la place.
Personnellement, j'aime garder les choses en UTC dans la mesure du possible (du moins pour le passé; stocker UTC pour l' avenir a des problèmes potentiels ), alors je suggérerais une structure comme celle-ci:
Vous pouvez changer les noms "TimeZone" en "TimeZoneInfo" pour rendre les choses plus claires - je préfère les noms plus courts moi-même.
la source
La structure DateTimeOffset a été créée pour exactement ce type d'utilisation.
Voir: http://msdn.microsoft.com/en-us/library/system.datetimeoffset.aspx
Voici un exemple de création d'un objet DateTimeOffset avec un fuseau horaire spécifique:
DateTimeOffset do1 = new DateTimeOffset(2008, 8, 22, 1, 0, 0, new TimeSpan(-5, 0, 0));
la source
Les autres réponses ici sont utiles, mais elles ne couvrent pas spécifiquement comment accéder à Pacific - c'est parti:
Curieusement, bien que "Pacific Standard Time" signifie normalement quelque chose de différent de "Pacific Daylight Time", dans ce cas, il se réfère à l'heure du Pacifique en général. En fait, si vous utilisez
FindSystemTimeZoneById
pour le récupérer, l'une des propriétés disponibles est un booléen vous indiquant si ce fuseau horaire est actuellement en heure d'été ou non.Vous pouvez voir des exemples plus généralisés de cela dans une bibliothèque que j'ai fini par lancer ensemble pour gérer les DateTimes dont j'ai besoin dans différentes TimeZones en fonction de l'endroit où l'utilisateur demande, etc.
https://github.com/b9chris/TimeZoneInfoLib.Net
Cela ne fonctionnera pas en dehors de Windows (par exemple Mono sous Linux) car la liste des heures provient du registre Windows:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\
En dessous, vous trouverez des clés (icônes de dossier dans l'éditeur de registre); les noms de ces clés sont ce à quoi vous passez
FindSystemTimeZoneById
. Sous Linux, vous devez utiliser un ensemble distinct de définitions de fuseau horaire standard Linux, que je n'ai pas suffisamment exploré.la source
J'ai modifié un peu la réponse de Jon Skeet pour le Web avec la méthode d'extension. Il fonctionne également sur l'azur comme un charme.
la source
Vous devrez créer un objet personnalisé pour cela. Votre objet personnalisé contiendra deux valeurs:
Je ne sais pas s'il existe déjà un type de données fourni par CLR qui en a, mais au moins le composant TimeZone est déjà disponible.
la source
J'aime la réponse de Jon Skeet, mais j'aimerais ajouter une chose. Je ne sais pas si Jon s'attendait à ce que le ctor soit toujours passé dans le fuseau horaire local. Mais je veux l'utiliser pour les cas où c'est autre chose que local.
Je lis les valeurs d'une base de données, et je sais dans quel fuseau horaire cette base de données se trouve. Donc, dans le ctor, je passerai dans le fuseau horaire de la base de données. Mais alors j'aimerais la valeur en heure locale. Le LocalTime de Jon ne renvoie pas la date d'origine convertie en date de fuseau horaire local. Il renvoie la date convertie dans le fuseau horaire d'origine (tout ce que vous avez passé dans le ctor).
Je pense que ces noms de propriétés éclaircissent les choses ...
la source
L'utilisation de la classe TimeZones facilite la création d'une date spécifique au fuseau horaire.
la source