Analyser les chaînes de date et d’heure dans .NET

Pour analyser des chaînes pour les convertir en objets DateTime, vous devez spécifier des informations sur la façon dont les dates et heures sont représentées sous forme de texte. L’ordre du jour, du mois et de l’année est différent selon les cultures. Certaines représentations temporelles utilisent une horloge de 24 heures, d’autres spécifient « AM » et « PM». Certaines applications n’ont besoin que de la date, D’autres n’utilisent que l’heure. alors que d’autres doivent spécifier la date et l’heure. Les méthodes qui convertissent des chaînes en objets DateTime vous permettent de fournir des informations détaillées sur les formats souhaités et les éléments d’une date et d’une heure dont votre application a besoin. Il existe trois tâches subordonnées pour convertir correctement du texte en DateTime :

  1. Vous devez spécifier le texte qui représente une date et une heure au format attendu.
  2. Vous pouvez spécifier la culture qui correspond au format de date et d’heure.
  3. Vous pouvez spécifier la façon dont les composants manquants d’une représentation textuelle sont définis dans la date et l’heure.

Les méthodes Parse et TryParse convertissent de nombreuses représentations communes de date et d’heure. Les méthodes ParseExact et TryParseExact convertissent une représentation sous forme de chaîne conforme au modèle spécifié par une chaîne de format de date et d’heure. Pour plus d’informations, consultez les articles sur les chaînes de format de date et d’heure standard et les chaînes de format de date et d’heure personnalisé.

L’objet courant DateTimeFormatInfo fournit davantage de contrôle sur la façon d’interpréter le texte comme une date et une heure. Les propriétés d’un DateTimeFormatInfo décrivent les séparateurs de date et d’heure, les noms de mois, de jours et de zones, ainsi que le format des désignations « AM » et « PM ». Le CultureInfo retourné par CultureInfo.CurrentCulture a une propriété CultureInfo.DateTimeFormat représentant la culture actuelle. Si vous souhaitez une culture spécifique ou des paramètres personnalisés, spécifiez le paramètre IFormatProvider d’une méthode d’analyse. Pour le paramètre IFormatProvider, vous devez spécifier un objet CultureInfo qui représente une culture, ou un objet DateTimeFormatInfo.

Certaines informations sur le texte représentant une date ou une heure peuvent être manquantes. Par exemple, pour la plupart des gens, la date « mars 12 » correspond à l’année en cours. De même que « mars 2018 » correspond au mois de mars de l’année 2018. Le texte représentant l’heure n’inclut souvent que les heures, les minutes et une désignation AM/PM. Les méthodes d’analyse gèrent ces informations manquantes à l’aide de valeurs par défaut raisonnables :

  • Lorsque seule l’heure est présente, la partie date utilise la date actuelle.
  • Lorsque seule la date est présente, la partie heure correspond à minuit.
  • Lors de l’année n’est pas spécifiée dans une date, l’année en cours est utilisée.
  • Lorsque le jour du mois n’est pas spécifié, le premier jour du mois est utilisé.

Si la date est présente dans la chaîne, elle doit inclure le mois et le jour ou l’année. Si l’heure est présente, elle doit inclure l’heure et soit les minutes soit l’indicateur AM/PM.

Vous pouvez spécifier la constante NoCurrentDateDefault pour remplacer ces valeurs par défaut. Lorsque vous utilisez cette constante, toute propriété manquante de l’année, du mois ou du jour est définie sur la valeur 1. Le dernier exemple qui utilise Parse illustre ce comportement.

Outre le composant de date et d’heure, la représentation sous forme de chaîne d’une date et d’une heure peut inclure un offset qui indique le décalage horaire par rapport au temps universel coordonné (UTC, Coordinated Universal Time). Par exemple, la chaîne « 2/14/2007 5:32:00 -7:00 » définit une heure qui est sept heures plus tôt que l’heure UTC. Si la représentation d’une heure sous forme de chaîne n’inclut pas d’offset, l’analyse retourne un objet DateTime dont la propriété Kind a la valeur DateTimeKind.Unspecified. Si un décalage est spécifié, l’analyse retourne un objet DateTime dont la propriété Kind est définie sur DateTimeKind.Local. Sa valeur est également ajustée en fonction du fuseau horaire local de votre ordinateur. Vous pouvez modifier ce comportement en utilisant une valeur DateTimeStyles avec la méthode d’analyse.

Le fournisseur de format est également utilisé pour interpréter une date numérique ambiguë. Il n’est pas évident de savoir quels composants de la date représentée par la chaîne « 02/03/04 » correspondent au mois, au jour et à l’année. Les composants sont interprétés d’après l’ordre des formats de date similaires dans le fournisseur de format.

Analyser

L’exemple suivant illustre l’utilisation de la méthode DateTime.Parse pour convertir une string en DateTime. Cet exemple fait appel à la culture associée au thread actuel. Si l’objet CultureInfo associé à la culture actuelle ne peut pas analyser la chaîne d’entrée, une exception FormatException est levée.

Conseil

Tous les exemples c# de cet article s’exécutent dans votre navigateur. Appuyez sur le bouton Exécuter pour afficher la sortie. Vous pouvez également les modifier pour vous entrainer.

Notes

Ces exemples sont disponibles dans le dépôt de documents GitHub pour C# et Visual Basic.

string dateInput = "Jan 1, 2009";
var parsedDate = DateTime.Parse(dateInput);
Console.WriteLine(parsedDate);
// Displays the following output on a system whose culture is en-US:
//       1/1/2009 00:00:00
Dim MyString As String = "Jan 1, 2009"
Dim MyDateTime As DateTime = DateTime.Parse(MyString)
Console.WriteLine(MyDateTime)
' Displays the following output on a system whose culture is en-US:
'       1/1/2009 00:00:00

Vous pouvez également définir explicitement la culture dont les conventions de mise en forme sont utilisées lorsque vous analysez une chaîne. Spécifiez l’un des objets standard DateTimeFormatInfo renvoyés par la propriété CultureInfo.DateTimeFormat. L’exemple suivant utilise un fournisseur de format pour analyser une chaîne en allemand dans DateTime. Il crée une CultureInfo représentant la culture de-DE. Cet objet CultureInfo garantit la réussite de l’analyse de cette chaîne particulière. Ce processus exclut tous les paramètres contenus dans CurrentCulture de CurrentThread.

var cultureInfo = new CultureInfo("de-DE");
string dateString = "12 Juni 2008";
var dateTime = DateTime.Parse(dateString, cultureInfo);
Console.WriteLine(dateTime);
// The example displays the following output:
//       6/12/2008 00:00:00
Dim MyCultureInfo As New CultureInfo("de-DE")
Dim MyString As String = "12 Juni 2008"
Dim MyDateTime As DateTime = DateTime.Parse(MyString, MyCultureInfo)
Console.WriteLine(MyDateTime)
' The example displays the following output:
'       6/12/2008 00:00:00

Toutefois, vous pouvez utiliser des surcharges de la méthode Parse pour spécifier des fournisseurs de formats personnalisés. La méthode Parse ne prend pas en charge l’analyse des formats non standard. Pour analyser une date et une heure exprimées dans un format non standard, utilisez à la place la méthode ParseExact.

L’exemple suivant utilise l’énumération DateTimeStyles pour spécifier que les informations de date et d’heure actuelles ne doivent pas être ajoutées à DateTime pour les champs non spécifiés.

var cultureInfo = new CultureInfo("de-DE");
string dateString = "12 Juni 2008";
var dateTime = DateTime.Parse(dateString, cultureInfo,
                                DateTimeStyles.NoCurrentDateDefault);
Console.WriteLine(dateTime);
// The example displays the following output if the current culture is en-US:
//      6/12/2008 00:00:00
Dim MyCultureInfo As New CultureInfo("de-DE")
Dim MyString As String = "12 Juni 2008"
Dim MyDateTime As DateTime = DateTime.Parse(MyString, MyCultureInfo,
                           DateTimeStyles.NoCurrentDateDefault)
Console.WriteLine(MyDateTime)
' The example displays the following output if the current culture is en-US:
'       6/12/2008 00:00:00

ParseExact

La méthode DateTime.ParseExact convertit une chaîne en un objet DateTime si elle est conforme à l’un des modèles de chaîne spécifiés. Quand une chaîne d’un autre format que les formats spécifiés est passée à cette méthode, une exception FormatException est levée. Vous pouvez spécifier un des spécificateurs de format standard de date et d’heure ou une combinaison de spécificateurs de format personnalisé de date et d’heure. En utilisant les spécificateurs de format personnalisé, vous pouvez construire une chaîne de reconnaissance personnalisée. Pour une explication des spécificateurs, consultez les articles relatifs aux chaînes de format de date et d’heure standard et aux chaînes de format de date et d’heure personnalisé.

Dans l’exemple suivant, la méthode DateTime.ParseExact reçoit un objet de chaîne à analyser, suivi par un spécificateur de format, puis un objet CultureInfo. Cette méthode ParseExact peut uniquement analyser des chaînes qui suivent le modèle de date longue dans la culture en-US.

var cultureInfo = new CultureInfo("en-US");
string[] dateStrings = { " Friday, April 10, 2009", "Friday, April 10, 2009" };
foreach (string dateString in dateStrings)
{
    try
    {
        var dateTime = DateTime.ParseExact(dateString, "D", cultureInfo);
        Console.WriteLine(dateTime);
    }
    catch (FormatException)
    {
        Console.WriteLine("Unable to parse '{0}'", dateString);
    }
}
// The example displays the following output:
//       Unable to parse ' Friday, April 10, 2009'
//       4/10/2009 00:00:00
Dim MyCultureInfo As New CultureInfo("en-US")
Dim MyString() As String = {" Friday, April 10, 2009", "Friday, April 10, 2009"}
For Each dateString As String In MyString
    Try
        Dim MyDateTime As DateTime = DateTime.ParseExact(dateString, "D",
                                                     MyCultureInfo)
        Console.WriteLine(MyDateTime)
    Catch e As FormatException
        Console.WriteLine("Unable to parse '{0}'", dateString)
    End Try
Next
' The example displays the following output:
'       Unable to parse ' Friday, April 10, 2009'
'       4/10/2009 00:00:00

Chaque surcharge des méthodes Parse et ParseExact a un paramètre IFormatProvider qui fournit des informations spécifiques à la culture sur la mise en forme de la chaîne. L’objet IFormatProvider est un objet CultureInfo qui représente une culture standard, ou un objet DateTimeFormatInfo qui est retourné par la propriété CultureInfo.DateTimeFormat. ParseExact utilise également une chaîne supplémentaire ou un argument de tableau de chaînes qui définit un ou plusieurs formats de date et d’heure.

Voir aussi