211 votes

Création d’une valeur DateTime dans un fuseau horaire spécifique en c# fx 3.5

Je suis en train de créer une unité de test pour tester le cas lorsque le fuseau horaire changements sur une machine parce qu'il a été défini de manière incorrecte, puis corrigé.

Dans le test que j'ai besoin d'être en mesure de créer des objets DateTime en aucun fuseau horaire local pour s'assurer que les personnes exécutant le test peut le faire avec succès, indépendamment de l'endroit où ils sont situés.

De ce que je peux voir à partir de la date de constructeur, je peux régler le Fuseau horaire pour être soit le fuseau horaire local, le fuseau horaire UTC ou non spécifié.

Comment puis-je créer un DateTime avec un fuseau horaire spécifique comme PST?

267voto

Jon Skeet Points 692016

Jon réponse parle de Fuseau horaire, mais je suggère à l'aide de TimeZoneInfo à la place.

Personnellement, j'aime garder les choses à l'UTC, si possible, j'aimerais suggérer une structure comme ceci:

public struct DateTimeWithZone
{
    private readonly DateTime utcDateTime;
    private readonly TimeZoneInfo timeZone;

    public DateTimeWithZone(DateTime dateTime, TimeZoneInfo timeZone)
    {
        utcDateTime = TimeZoneInfo.ConvertTimeToUtc(dateTime, timeZone); 
        this.timeZone = timeZone;
    }

    public DateTime UniversalTime { get { return utcDateTime; } }

    public TimeZoneInfo TimeZone { get { return timeZone; } }

    public DateTime LocalTime
    { 
        get 
        { 
            return TimeZoneInfo.ConvertTime(utcDateTime, timeZone); 
        }
    }        
}

Vous pouvez changer le "Fuseau horaire" des noms de "TimeZoneInfo" pour rendre les choses plus claires - je préfère le plus bref des noms de moi-même.

69voto

Clever Human Points 3174

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 :

``

54voto

Chris Moschini Points 7278

Les autres réponses ici sont utiles, mais ils ne couvrent pas comment accéder Pacifique spécifiquement ici, vous allez:

public static DateTime GmtToPacific(DateTime dateTime)
{
    return TimeZoneInfo.ConvertTimeFromUtc(dateTime,
        TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"));
}

Curieusement, bien que la "Pacific Standard Time" signifie quelque chose de différent de "Pacifique du Temps Quotidien," dans ce cas, il se réfère à l'heure du Pacifique en général. En fait, si vous utilisez FindSystemTimeZoneById pour la récupérer, l'une des propriétés est un bool vous informant que le fuseau horaire est actuellement en heure d'été ou pas.

Vous pouvez voir plus généralisé des exemples de cela dans une bibliothèque, j'ai fini par jeter ensemble pour faire face DateTimes j'ai besoin dans des fuseaux horaires différents selon l'endroit où l'utilisateur demande à partir, etc:

https://github.com/b9chris/TimeZoneInfoLib.Net

Cela ne peut pas fonctionner en dehors de Windows (par exemple Mono sous Linux) depuis la liste des temps vient à partir de la base de Registre Windows: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\

En dessous, vous trouverez les clés (les icônes de dossier dans l'Éditeur du Registre); les noms de ces clés sont ce que vous lui transmettez FindSystemTimeZoneById. Sur Linux, vous devez utiliser un Linux standard de l'ensemble de définitions de fuseau horaire, je n'en ai pas suffisamment explorée.

6voto

Jernej Novak Points 792

J’ai modifié un peu Jon Skeet réponse pour le web avec la méthode d’extension. Il travaille également sur azure comme un charme.

1voto

Jon Limjap Points 46429

Vous devrez créer un objet personnalisé pour cela. Votre objet personnalisé contient deux valeurs :

Pas sûr, que s’il y a déjà un type de données CLR fourni qui a, mais au moins le composant fuseau horaire est déjà disponible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X