38 votes

Comment afficher l'heure de la date avec un fuseau horaire abrégé ?

Je suis conscient de la System.TimeZone ainsi que les nombreuses utilisations de la classe DateTime.ToString() méthode. Ce que je n'ai pas pu trouver, c'est un moyen de convertir une DateTime en une chaîne de caractères qui, en plus des informations sur l'heure et la date, contient l'abréviation à trois lettres du fuseau horaire (en fait, de la même manière que les infobulles de StackOverflow pour l'affichage de l'heure relative).

Afin de rendre un exemple facile à suivre et à consommer pour tous, reprenons l'exemple de StackOverflow. Si vous regardez l'infobulle qui s'affiche sur les heures relatives, elle indique la date complète, l'heure, y compris les secondes, au format 12 heures, une désignation AM/PM, puis l'abréviation du fuseau horaire à trois lettres (dans leur cas, le temps universel coordonné). Je réalise que je pourrais facilement obtenir l'heure GMT ou UTC en utilisant les méthodes intégrées, mais ce que je veux vraiment, c'est l'heure telle qu'elle est localement - dans ce cas, sur un serveur web.

Si notre serveur web fonctionne sous Windows Server 2k3 et que son fuseau horaire est défini sur CST (ou, jusqu'à ce que l'heure d'été ), j'aimerais que notre application Web ASP.NET affiche les dates et heures relatives à ce fuseau horaire et qu'elle soit formatée pour afficher un "CST" à la fin. Je réalise que je pourrais facilement coder cela en dur, mais dans l'intérêt de la robustesse, je préférerais vraiment une solution basée sur les paramètres d'environnement du système d'exploitation du serveur qui exécute le code.

Actuellement, j'ai tout sauf l'abréviation du fuseau horaire en utilisant le code suivant :

myDateTime.ToString("MM/dd/yyyy hh:mm:ss tt")

Qui affiche :

10/07/2008 03:40:31 PM

Tout ce que je veux (et ce n'est pas grand-chose, promis !) c'est qu'il dise :

10/07/2008 03:40:31 PM CDT

Je peux utiliser System.TimeZone.CurrentTimeZone et l'utiliser pour afficher correctement "Central Daylight Time" mais... c'est un peu trop long par souci de concision. Suis-je alors obligé d'écrire une routine de manipulation de chaîne pour supprimer les espaces et les lettres non majuscules ? Bien que cela puisse fonctionner, cela me semble incroyablement compliqué...

Sur Google : et la recherche sur ce site n'a rien donné pour répondre à ma question.

20voto

craigmoliver Points 3022

Voici la méthode que je viens de mettre au point pour contourner ce problème.

public static String TimeZoneName(DateTime dt)
{
    String sName = TimeZone.CurrentTimeZone.IsDaylightSavingTime(dt) 
        ? TimeZone.CurrentTimeZone.DaylightName 
        : TimeZone.CurrentTimeZone.StandardName;

    String sNewName = "";
    String[] sSplit = sName.Split(new char[]{' '});
    foreach (String s in sSplit)
        if (s.Length >= 1)
            sNewName += s.Substring(0, 1);

    return sNewName;
}

6voto

Dave Moore Points 1633

Il existe une bibliothèque en libre accès, TZ4NET qui dispose de ces abréviations. Avant la version 3.5 de .NET, c'était également l'une des seules possibilités de conversion entre les fuseaux horaires.

Si vous ne voulez pas d'une bibliothèque séparée, vous pouvez certainement générer une carte d'abréviations raisonnables en utilisant les classes TimeZoneInfo, puis les fournir à votre utilisateur.

2voto

Pavel Chuchuva Points 12220

Je voudrais créer une table de consultation qui convertit le nom du fuseau horaire en son abréviation. Si la correspondance n'est pas trouvée, vous pourriez renvoyer le nom complet du fuseau.

Voir abréviations des fuseaux horaires .

2voto

Bob Houghton Points 11

Si vous tirez l'abréviation du DaylightName/StandardName, il est préférable de construire la chaîne à l'aide d'un StringBuilder, car les chaînes sont immuables.

    public static string ToCurrentTimeZoneString(this DateTime date)
    {
        string name = TimeZone.CurrentTimeZone.IsDaylightSavingTime(date) ?
            TimeZone.CurrentTimeZone.DaylightName :
            TimeZone.CurrentTimeZone.StandardName;
        return name;
    }

    public static string ToCurrentTimeZoneShortString(this DateTime date)
    {
        StringBuilder result = new StringBuilder();

        foreach (string value in date.ToCurrentTimeZoneString().Split(' '))
        {
            if (value.IsNotNullOrEmptyWithTrim())
            {
                result.Append(char.ToUpper(value[0]));
            }
        }

        return result.ToString();
    }

Bien sûr, un tableau contenant des KeyValuePair's est probablement plus approprié pour une entreprise multinationale. Si vous voulez gagner quelques minutes sur un délai serré, et que vous êtes dans une entreprise américaine, cela fonctionne.

1voto

Gerald Points 13865

Cela dépend du niveau de robustesse dont vous avez besoin.

Vous aurez probablement besoin d'une sorte de piratage dans tous les cas. Un moyen simple serait de diviser la chaîne de caractères par des espaces, puis de concaténer la première lettre de chaque mot, soit

string[] words = tzname.Split(" ".ToCharArray());
string tzabbr = "";
foreach (string word in words)
   tzabbr += word[0];

Cela ne fonctionnera pas pour tous les fuseaux horaires de la planète, mais pour la plupart d'entre eux. Si vous avez besoin d'un système plus robuste, vous devrez probablement créer une carte qui associe les noms des fuseaux horaires à leurs abréviations.

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