Share via


Mise en forme de la date et de l'heure pour une culture spécifique

Mise à jour : novembre 2007

La structure DateTime fournit des méthodes qui permettent à vos applications d'exécuter des opérations dépendantes de la culture sur un type DateTime. Une application peut utiliser la classe DateTimeFormatInfo pour mettre en forme et afficher un type DateTime selon la culture. Par exemple, à l'aide de ShortDatePattern, la date du 1er février 2001 peut être mis sous la forme 2/1/2001 pour l'Anglais (États-Unis), « en-US » et 01/02/2001 pour l'Anglais (Royaume-Uni), « en-GB ».

Un objet DateTimeFormatInfo peut être créé pour une culture spécifique ou pour la culture indifférente mais non pour être indépendant de la culture. Une culture neutre ne fournit pas suffisamment d'informations pour afficher le format de date correct. Une exception est levée si l'application essaie de créer un objet DateTimeFormatInfo à l'aide d'une culture neutre. Pour plus d'informations sur la mise en forme de DateTime, consultez Chaînes de format de date et d'heure.

L'exemple de code suivant affiche la date courante à l'aide de ShortDatePattern lorsque la culture actuelle CurrentThread a la valeur Anglais (États-Unis), « en-US » puis passe en Allemand (Allemagne), « de-DE ».

Imports System
Imports System.Globalization
Imports System.Threading

Public Class FormatDate
   
   Public Shared Sub Main()
      Dim dt As DateTime = DateTime.Now
      ' Sets the CurrentCulture property to U.S. English.
      Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
      ' Displays dt, formatted using the ShortDatePattern
      ' and the CurrentThread.CurrentCulture.
      Console.WriteLine(dt.ToString("d"))
      
      ' Creates a CultureInfo for German in Germany.
      Dim ci As New CultureInfo("de-DE")
      ' Displays dt, formatted using the ShortDatePattern
      ' and the CultureInfo.
      Console.WriteLine(dt.ToString("d", ci))
   End Sub
End Class
using System;
using System.Globalization;
using System.Threading;

public class FormatDate
{
   public static void Main()
   {
      DateTime dt = DateTime.Now;
      // Sets the CurrentCulture property to U.S. English.
      Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
      // Displays dt, formatted using the ShortDatePattern
      // and the CurrentThread.CurrentCulture.
      Console.WriteLine(dt.ToString("d"));
      
      // Creates a CultureInfo for German in Germany.
      CultureInfo ci = new CultureInfo("de-DE");
      // Displays dt, formatted using the ShortDatePattern
      // and the CultureInfo.
      Console.WriteLine(dt.ToString("d", ci));
   }
}

Si vous exécutez ce code le 9 juillet 2001, vous obtenez la sortie suivante :

7/9/2001
09.07.2001

Utilisation des fuseaux horaires

La structure de DateTime utiliser toujours le fuseau horaire local pour les calculs et comparaisons. Vous devez prendre ceci en compte lorsque votre application utilise les méthodes Parse() et ParseExact(). Ces méthodes sont des surcharges qui vous permettent de convertir la représentation sous forme de chaîne d'une date et d'une heure en un type DateTime. Votre application peut également mettre en forme un type DateTime pour une culture spécifique. Si vous ne spécifiez pas de fuseau horaire dans la chaîne que vous leur passez, ces méthodes récupèrent la date et l'heure analysées sans effectuer de correction de fuseau horaire. La date et l'heure sont basées sur le paramètre du système d'exploitation définissant le fuseau horaire. Si l'application spécifie un décalage de fuseau horaire, ces méthodes analysent la chaîne date/heure et la convertissent d'abord en heure universelle coordonnée (UTC, Coordinated Universal Time ; anciennement connue sous le nom d'heure de Greenwich, GMT, Greenwich Mean Time), puis en heure sur le système local.

L'application doit utiliser la méthode ToUniversalTime pour convertir un type DateTime local en son équivalent UTC. Pour analyser une chaîne de date/heure et la convertir en un type UTC DateTime, l'application doit utiliser la valeur AdjustToUniversal de l'énumération DateTimeStyles avec soit la méthode Parse() soit la méthode ParseExact().

Le code d'exemple suivant crée un objet DateTime pour l'heure locale, puis le convertit en son équivalent UTC. Les deux types sont convertis en chaînes et envoyés à la console. Remarquez que les chaînes diffèrent par l'offset UTC entre le fuseau horaire local et l'heure UTC. Ces chaînes sont ensuite reconverties en types DateTime à l'aide de la méthode ParseExact(). Pour capturer les informations de fuseau horaire stockées dans utcdt, la valeur AdjustToUniversal de DateTimeStyles doit être spécifiée comme paramètre de la méthode ParseExact. Pour plus d'informations sur les offsets UTC pour différents fuseaux horaires, consultez GetUtcOffset.

Imports System
Imports System.Globalization
Imports System.Threading

Public Class TimeZoneSample
   Public Shared Sub Main()
      Dim en As New CultureInfo("en-US")
      Thread.CurrentThread.CurrentCulture = en

      ' Creates a DateTime for the local time.
      Dim dt As New DateTime(2001, 7, 13, 4, 0, 0)

      ' Converts the local DateTime to the UTC time.
      Dim utcdt As DateTime = dt.ToUniversalTime()

      ' Defines a custom string format to display the DateTime.
      ' zzz specifies the full time zone offset.
      Dim format As [String] = "MM/dd/yyyy hh:mm:sszzz"

      ' Converts the local time to a string
      ' using the custom format string and display.
      Dim str As [String] = dt.ToString(format)
      Console.WriteLine(str)

      ' Converts the UTC time to a string
      ' using the custom format string and display.
      Dim utcstr As [String] = utcdt.ToString(format)
      Console.WriteLine(utcstr)

      ' Converts the string back to a local DateTime and displays it.
      Dim parsedBack As DateTime = DateTime.ParseExact(str, format, 
            en.DateTimeFormat)
      Console.WriteLine(parsedBack)

      ' Converts the string back to a UTC DateTime and displays it.
      ' If you do not use the DateTime.ParseExact method that takes
      ' a DateTimeStyles.AdjustToUniversal value, the parsed DateTime
      ' will not include the time zone information. 
      Dim parsedBackUTC As DateTime = DateTime.ParseExact(str, format, _
            en.DateTimeFormat, DateTimeStyles.AdjustToUniversal)
      Console.WriteLine(parsedBackUTC)
   End Sub
End Class
using System;
using System.Globalization;
using System.Threading;

public class TimeZoneSample
{
   public static void Main()
   {
      CultureInfo en = new CultureInfo("en-US");
      Thread.CurrentThread.CurrentCulture = en;

      // Creates a DateTime for the local time.
      DateTime dt = new DateTime(2001, 7, 13, 4, 0, 0);

      // Converts the local DateTime to the UTC time.
      DateTime utcdt = dt.ToUniversalTime();

      // Defines a custom string format to display the DateTime value.
      // zzzz specifies the full time zone offset.
      String format = "MM/dd/yyyy hh:mm:sszzz";

      // Converts the local DateTime to a string 
      // using the custom format string and display.
      String str = dt.ToString(format);
      Console.WriteLine(str);

      // Converts the UTC DateTime to a string 
      // using the custom format string and display.
      String utcstr = utcdt.ToString(format);
      Console.WriteLine(utcstr);

      // Converts the string back to a local DateTime and displays it.
      DateTime parsedBack =
            DateTime.ParseExact(str,format,en.DateTimeFormat);
      Console.WriteLine(parsedBack);

      // Converts the string back to a UTC DateTime and displays it.
      // If you do not use the DateTime.ParseExact method that takes
      // a DateTimeStyles.AdjustToUniversal value, the parsed DateTime
      // object will not include the time zone information.
      DateTime parsedBackUTC = DateTime.ParseExact(str,format, _
            en.DateTimeFormat, DateTimeStyles.AdjustToUniversal);
      Console.WriteLine(parsedBackUTC);
   }
}

Ce code génère la sortie suivante :

07/13/2001 04:00:00-07:00
07/13/2001 11:00:00-07:00
7/13/2001 4:00:00 AM
7/13/2001 11:00:00 AM

Utilisation des membres de la structure DateTime

Lorsque vous utilisez la structure DateTime, sachez que les membres tels que Day sont basés sur le calendrier grégorien. Même si votre application modifie le calendrier actuel ou autorise l'utilisateur à modifier des paramètres de date et d'heure via les Options régionales et linguistiques du Panneau de configuration, le calendrier grégorien est encore utilisé pour exécuter les calculs pour les méthodes DateTime, ce qui permet d'empêcher que l'arithmétique de ces méthodes soit altérée par les paramètres utilisateurs. Si vous souhaitez que votre application exécute des opérations de date et d'heure dépendantes de la culture basées sur le calendrier actuel, l'application doit utiliser la propriété Calendar pour appeler les méthodes fournies par la classe Calendar, telle que GetDayOfMonth. Pour obtenir un exemple de la différence entre les valeurs récupérées par les membres de DateTime et les membres de Calendar, consultez Utilisation de calendriers pour des cultures spécifiques.

Lors de l'utilisation de la structure DateTime, sachez qu'un type DateTime est une valeur immuable. Par conséquent, les méthodes telles que AddDays récupèrent une nouvelle valeur de DateTime au lieu d'incrémenter une valeur existante. L'exemple suivant montre comment incrémenter un type DateTime d'un jour, à l'aide de l'instruction dt = dt.AddDays(1).

Imports System
Imports System.Globalization
Imports System.Threading
Imports Microsoft.VisualBasic

Public Class TestClass
   
   Public Shared Sub Main()
      Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
      
      Dim dt As DateTime = DateTime.Now
      Console.WriteLine(ControlChars.Newline + " Today is {0}", _
         DateTime.Now.ToString("d"))
      
      ' Increments dt by one day.
      dt = dt.AddDays(1)
      Console.WriteLine(ControlChars.Newline + " Tomorrow is {0}", _
         dt.ToString("d"))
   End Sub
End Class
using System;
using System.Globalization;
using System.Threading;

public class TestClass
{
   public static void Main()
   {
      Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

      DateTime dt = DateTime.Now;
      Console.WriteLine("Today is {0}", DateTime.Now.ToString("d"));

      // Increments dt by one day.
      dt = dt.AddDays(1);
      Console.WriteLine("Tomorrow is {0}", dt.ToString("d"));

   }
}

Si vous exécutez ce code le 3 août 2001, vous obtenez la sortie suivante :

Today is 8/3/2001
Tomorrow is 8/4/2001

Voir aussi

Concepts

Chaînes de format de date et d'heure

Autres ressources

Codage et localisation