Utiliser les fuseaux horaires (TimeZone) avec ASP.NET

 01/01/2019 |   Admin |  C#


Je travaille actuellement dans une entreprise londonienne, Vestibule-solutions : http://www.vestibule-solutions.com/.

Afin de pouvoir commercialiser ses produits à l'international, la gestion des fuseaux horaires devenait une urgence. Les serveurs sont situés au Royaume Unis, donc si l'on utilise par exemple la fonction DateTime.Now pour un client en Chine, la date retournée sera la date du serveur. Ce qui peut etre étrange pour le client.

Pour moi, le meilleur moyen d'utiliser la gestion des fuseaux horaires est :

  • d'ajouter une classe qui implémentera les méthodes de la classe TimeZoneInfo (Qui a été ajoutée dans le framework 4). Il est préférable d'ajouter une classe pour la flexibilité. Si vous voulez implémenter ou modifier le moyen d'utiliser les fuseaux horaires, seulement cette classe aura besoin d'etre modifiée. 
  • De stocker les dates et heures en base de données au format du serveur. Beaucoup plus simple pour la maintenance. Et si un client venait a changer de pays, il suffit de changer seulement une valeur dans le fichier de configuration.
  • Et bien sur d'afficher toutes les dates sur l'interface utilisateur au format "Local". Toutes les manipulation des dates internes au programme doivent rester au format serveur. 

1- Créer la classe MyDateTime

//-----------------------------------------------------------------------
// <copyright file="MyDateTime.cs" company="Vestibule Solutions">
//     Copyright (c) Vestibule Solutions. All rights reserved.
// </copyright>
// <author>Pierre-Henri Nogues</author>
// <date>17/01/2012</date>
//-----------------------------------------------------------------------
 
namespace Exact.Hospitality.Core.Utility
{
    #region IMPORTS
 
    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Text;
    using Exact.Hospitality.Core.BusinessLogic;
 
    #endregion
 
    ///<summary>
    /// Class MyDateTime to use the TimeZone functions
    ///</summary>
    public class MyDateTime
    {
        #region Properties
 
        ///<summary>
        /// Gets the time zone name of the customer
        ///</summary>
        public static string TimeZoneName
        {
            get
            {
                string timeZone = ConfigurationManager.AppSettings[Constants.AppConfig.TIMEZONE];
 
                if (string.IsNullOrEmpty(timeZone))
                {
                    timeZone = TimeZoneInfo.Local.Id;
                }
 
                return timeZone;
            }
        }
 
        #endregion
 
        #region NOW
 
        ///<summary>
        /// Gets the dateNow of the customer timeZone
        ///</summary>
        public static DateTime Now
        {
            get
            {
                return ConvertToTimeZone(DateTime.Now);
            }
        }
 
        #endregion
 
        #region ConvertTo
 
        ///<summary>
        /// Convert the dateTime to the timeZone dateTime
        ///</summary>
        ///<param name="dt">The dateTime to convert</param>
        ///<returns>Return the dateTime of the time zone</returns>
        public static DateTime ConvertToTimeZone(DateTime dt)
        {
            return TimeZoneInfo.ConvertTimeBySystemTimeZoneId(dt, TimeZoneName);
        }
 
        ///<summary>
        /// Convert the dateTime to the timeZone dateTime
        ///</summary>
        ///<param name="dateString">The dateTime to convert</param>
        ///<returns>Return the dateTime of the time zone</returns>
        public static string ConvertToTimeZone(string dateString)
        {
            try
            {
                if (!string.IsNullOrEmpty(dateString))
                {
                    return TimeZoneInfo.ConvertTimeBySystemTimeZoneId(Convert.ToDateTime(dateString), TimeZoneName).ToString();
                }
                else
                {
                    return string.Empty;
                }
            }
            catch (FormatException fEx)
            {
                // Your logger here ** (Log4Net for example)
 
                return string.Empty;
            }
        }
 
        ///<summary>
        /// Convert the dateTime to the local time
        ///</summary>
        ///<param name="dt">The dateTime to convert</param>
        ///<returns>The local time of this time zone dateTime</returns>
        public static DateTime ConvertToLocal(DateTime dt)
        {
            return TimeZoneInfo.ConvertTime(dt, TimeZoneInfo.FindSystemTimeZoneById(TimeZoneName), TimeZoneInfo.Local);
        }
 
        ///<summary>
        /// Convert a date string to the datetime local time
        ///</summary>
        ///<param name="dateTimeString">The dateTime string to convert</param>
        ///<returns>The local time of this time zone dateTime</returns>
        public static DateTime ConvertToLocal(string dateTimeString)
        {
             return TimeZoneInfo.ConvertTime(Convert.ToDateTime(dateTimeString), TimeZoneInfo.FindSystemTimeZoneById(TimeZoneName), TimeZoneInfo.Local);
        }

        #endregion
 
        #region GetTimeZones
 
        ///<summary>
        /// Get all the time zones
        ///</summary>
        ///<returns>The time zone list</returns>
        public static IList<TimeZoneInfo> GetTimeZones()
        {
            return TimeZoneInfo.GetSystemTimeZones();
        }
 
        #endregion
    }
}

2 - Comment utiliser cette classe :

Du serveur au navigateur :

Utiliser "Now" comme avant mais non plus avec "DateTime.Now" mais "MyDateTime.Now"

Exemple :

txtDate.Text = MyDateTime.Now.ToShortDateString();
Du navigateur au serveur (ou base de données) :

Au lieu d'utiliser "Convert.ToDatetime", utiliser "MyDateTime.ConvertToLocale"

Exemple :

DateTime theDate = MyDateTime.ConvertToLocale(txtDate.Text);

3 - Ajouter la constante dans votre fichier Constants.cs (Ou le creer si vous ne l'utiliser pas)

public class Constants
{
///<summary>
/// Constants for the key of the app.config file
///</summary>
public class AppConfig
{
public const string TIMEZONE = "TimeZone";
}
}

4 - Utiliser app.config pour stocker l'identifiant de la "TimeZone"

<?xmlversion="1.0"encoding="utf-8" ?>
<appSettings>
    <addkey="TimeZone"value="Kamchatka Standard Time" />
</appSettings>

 

Il s'agit d'un exemple avec un client web qui

  • liste tous les fuseaux horaires
  • Change le fuseaux horaire de l'application
  • Affiche l'heure avec le fuseau utilisé
  • Read et Write dans le fichier app.config, l'identifiant de la TimeZone a utiliser

N'hésitez à laisse vos commentaires pour discuter de cette article.

Lire >>

  • 1