Mise en forme de la date et de l'heure pour une culture spécifique
La structure DateTime fournit des méthodes, telles que DateTime.ToString et DateTime.Parse, qui vous permettent d'effectuer des opérations dépendantes de la culture sur DateTime. Utilisez la classe DateTimeFormatInfo pour mettre en forme et afficher DateTime en fonction de la culture. DateTimeFormatInfo définit la façon dont les valeurs DateTime sont mises en forme et affichées, en fonction de la culture. Par exemple, si vous utilisez le format ShortDatePattern, la date 1 février 2001 est présentée sous la forme 2/1/2001 pour la culture "en-US" et 01/02/2001 pour la culture "en-GB".
Une instance de la classe DateTimeFormatInfo peut être créée pour une culture spécifique ou pour la culture invariante, mais non pour une culture neutre. Une culture neutre ne fournit pas suffisamment d'informations pour afficher le format de date correct. Une exception est levée si vous tentez de créer une instance de DateTimeFormatInfo pour une culture neutre. Pour plus d'informations sur la mise en forme des valeurs DateTime, consultez Chaînes de format de date et d'heure.
L'exemple de code suivant affiche la date du jour au format DateTimeFormatInfo.ShortDatePattern lorsque CurrentThread.CurrentCulture reçoit la valeur "en-US" (anglais aux Etats-Unis), puis "de-DE" (allemand en Allemagne).
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
Les méthodes et les propriétés de la structure DateTime utilisent toujours le fuseau horaire local pour les calculs et les comparaisons. Vous devez en tenir compte lorsque vous utilisez la méthode DateTime.Parse et la méthode DateTime.ParseExact. Ces méthodes offrent 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. Vous pouvez aussi choisir de mettre en forme une valeur 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 retournent 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 définissant le fuseau horaire du système. Si vous spécifiez 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.
Utilisez la méthode DateTime.ToUniversalTime pour convertir un DateTime local en son équivalent UTC. Pour analyser une chaîne date/heure et la convertir en DateTime UTC, utilisez la valeur AdjustToUniversal de l'énumération DateTimeStyles avec la méthode DateTime.Parse ou DateTime.ParseExact. Ces manipulations d'objet DateTime sont illustrées dans l'exemple de code suivant. Cet exemple 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 le décalage UTC entre le fuseau horaire local et l'heure UTC. Pour plus d'informations sur le décalage UTC pour divers fuseaux horaires, consultez la méthode TimeZone.GetUtcOffset. Ces chaînes sont ensuite reconverties en types DateTime à l'aide de la méthode DateTime.ParseExact. Notez que pour capturer les informations de fuseau horaire stockées dans utcdt
, la valeur AdjustToUniversal doit être spécifiée comme paramètre de la méthode DateTime.ParseExact.
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 les méthodes fournies par la structure DateTime, vous devez garder à l'esprit le fait que les membres, tels que Day,Month, Year et DateTime.AddDays sont basés sur le calendrier grégorien. Même si vous modifiez le calendrier actif dans le code de votre application ou les paramètres de date et d'heure à l'aide de la boîte de dialogue Options régionales du Panneau de configuration, le calendrier grégorien continue à être utilisé pour effectuer les calculs pour ces méthodes. Cette fonctionnalité empêche les calculs arithmétiques effectués par ces méthodes d'être faussés par les paramètres d'un utilisateur. Si vous voulez utiliser le calendrier actif pour effectuer des opérations dépendantes de la culture sur des dates et des heures, vous devez vous servir de la propriété DateTimeFormatInfo.Calendar pour appeler les méthodes fournies par la classe Calendar, telles que Calendar.GetDayOfMonth, Calendar.GetMonth, Calendar.GetYear et Calendar.AddDays. Pour obtenir un exemple de la différence entre les valeurs retournées par les membres de la structure DateTime et les membres de la classe Calendar, consultez Utilisation de calendriers pour des cultures spécifiques.
Lorsque vous utilisez la structure DateTime, ne perdez jamais de vue que DateTime est un type valeur et qu'il est immuable. Par conséquent, les opérations telles que DateTime.AddDays retournent une nouvelle valeur DateTime au lieu d'incrémenter une valeur existante. L'exemple suivant montre comment incrémenter une valeur 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
Référence
Concepts
Chaînes de format de date et d'heure