Partager via


Comment : afficher des dates dans des calendriers non grégoriens

Les types DateTime et DateTimeOffset utilisent le calendrier grégorien comme calendrier par défaut. Par conséquent, lorsque vous appelez la méthode ToString d'une valeur de date et d'heure, la représentation sous forme de chaîne de ces date et heure est affichée dans le calendrier grégorien, même si elles ont été créées à l'aide d'un autre calendrier. L'exemple suivant illustre deux méthodes différentes qui permettent de créer une valeur de date et d'heure avec le calendrier persan et de l'afficher dans le calendrier grégorien lorsque la méthode ToString est appelée. Cet exemple reflète deux techniques souvent utilisées, mais incorrectes, pour afficher la date dans un calendrier particulier.

������Dim persianCal As New PersianCalendar()

      Dim persianDate As Date = persianCal.ToDateTime(1387, 3, 18, _
                                                      12, 0, 0, 0)
      Console.WriteLine(persianDate.ToString())

      persianDate = New DateTime(1387, 3, 18, persianCal)
      Console.WriteLine(persianDate.ToString())
      ' The example displays the following output to the console:
      '       6/7/2008 12:00:00 PM
      '       6/7/2008 12:00:00 AM
������PersianCalendar persianCal = new PersianCalendar();

      DateTime persianDate = persianCal.ToDateTime(1387, 3, 18, 12, 0, 0, 0);
      Console.WriteLine(persianDate.ToString());

      persianDate = new DateTime(1387, 3, 18, persianCal);
      Console.WriteLine(persianDate.ToString());
      // The example displays the following output to the console:
      //       6/7/2008 12:00:00 PM
      //       6/7/2008 12:00:00 AM

Vous pouvez afficher la date dans un calendrier particulier en faisant appel à deux techniques différentes. Avec la première, le calendrier doit être défini par défaut pour une culture particulière, tandis qu'avec la seconde, n'importe quel calendrier peut être utilisé.

Pour afficher la date pour le calendrier par défaut d'une culture

  1. Instanciez un objet de calendrier dérivé de la classe Calendar qui représente le calendrier à utiliser.

  2. Instanciez un objet CultureInfo qui représente la culture dont la mise en forme sera utilisée pour afficher la date.

  3. Appelez la méthode Array.Exists<T> pour déterminer si l'objet de calendrier est membre du tableau retourné par la propriété CultureInfo.OptionalCalendars. Cela indique que le calendrier peut servir de calendrier par défaut pour l'objet CultureInfo. S'il n'est pas membre du tableau, suivez les instructions de la section « Pour afficher la date dans un calendrier quelconque ».

  4. Assignez l'objet de calendrier à la propriété Calendar de l'objet DateTimeFormatInfo retourné par la propriété CultureInfo.DateTimeFormat.

    RemarqueRemarque

    La classe CultureInfo possède également une propriété Calendar.Toutefois, comme elle est constante et en lecture seule, elle ne change pas pour refléter le nouveau calendrier par défaut assigné à la propriété DateTimeFormatInfo.Calendar.

  5. Appelez la méthode ToString ou ToString et passez-lui l'objet CultureInfo dont le calendrier par défaut a été modifié à l'étape précédente.

Pour afficher la date dans un calendrier quelconque

  1. Instanciez un objet de calendrier dérivé de la classe Calendar qui représente le calendrier à utiliser.

  2. Déterminez les éléments de date et d'heure qui doivent apparaître dans la représentation sous forme de chaîne de la valeur de date et d'heure.

  3. Pour chaque élément de date et d'heure que vous souhaitez afficher, appelez la méthode Get de l'objet de calendrier. Les méthodes disponibles sont les suivantes :

    • GetYear pour afficher l'année dans le calendrier approprié.

    • GetMonth pour afficher le mois dans le calendrier approprié.

    • GetDayOfMonth pour afficher le jour du mois dans le calendrier approprié.

    • GetHour pour afficher l'heure du jour dans le calendrier approprié.

    • GetMinute pour afficher les minutes de l'heure dans le calendrier approprié.

    • GetSecond pour afficher les secondes de la minute dans le calendrier approprié.

    • GetMilliseconds pour afficher les millisecondes de la seconde dans le calendrier approprié.

Exemple

L'exemple affiche une date à l'aide de deux calendriers différents : le calendrier Hijri défini comme calendrier par défaut pour la culture ar-JO et le calendrier persan qui n'est pas pris en charge comme calendrier facultatif par la culture fa-IR.

Imports System.Globalization

Public Class CalendarDates
   Public Shared Sub Main()
      Dim hijriCal As New HijriCalendar()
      Dim hijriUtil As New CalendarUtility(hijriCal)
      Dim hijriDate1 As Date = New Date(1429, 6, 29, hijriCal)
      Dim hijriDate2 As DateTimeOffset = New DateTimeOffset(hijriDate1, _
                                         TimeZoneInfo.Local.GetUtcOffset(hijriDate1))
      Dim jc As CultureInfo = CultureInfo.CreateSpecificCulture("ar-JO")

      ' Display the date using the Gregorian calendar.
      Console.WriteLine("Using the system default culture: {0}", _
                        hijriDate1.ToString("d"))
      ' Display the date using the ar-JO culture's original default calendar.
      Console.WriteLine("Using the ar-JO culture's original default calendar: {0}", _
                        hijriDate1.ToString("d", jc))
      ' Display the date using the Hijri calendar.
      Console.WriteLine("Using the ar-JO culture with Hijri as the default calendar:")
      ' Display a Date value.
      Console.WriteLine(hijriUtil.DisplayDate(hijriDate1, jc))
      ' Display a DateTimeOffset value.
      Console.WriteLine(hijriUtil.DisplayDate(hijriDate2, jc))

      Console.WriteLine()

      Dim persianCal As New PersianCalendar()
      Dim persianUtil As New CalendarUtility(persianCal)
      Dim ic As CultureInfo = CultureInfo.CreateSpecificCulture("fa-IR")

      ' Display the date using the ir-FA culture's default calendar.
      Console.WriteLine("Using the ir-FA culture's default calendar: {0}", _      
                        hijriDate1.ToString("d", ic))
      ' Display a Date value.
      Console.WriteLine(persianUtil.DisplayDate(hijriDate1, ic))
      ' Display a DateTimeOffset value.
      Console.WriteLine(persianUtil.DisplayDate(hijriDate2, ic))
   End Sub
End Class

Public Class CalendarUtility
   Private thisCalendar As Calendar
   Private targetCulture As CultureInfo

   Public Sub New(cal As Calendar)
      Me.thisCalendar = cal
   End Sub

   Private Function CalendarExists(culture As CultureInfo) As Boolean
      Me.targetCulture = culture
      Return Array.Exists(Me.targetCulture.OptionalCalendars, _
                          AddressOf Me.HasSameName)
   End Function 

   Private Function HasSameName(cal As Calendar) As Boolean
      If cal.ToString() = thisCalendar.ToString() Then
         Return True
      Else
         Return False
      End If
   End Function

   Public Function DisplayDate(dateToDisplay As Date, _
                               culture As CultureInfo) As String
      Dim displayOffsetDate As DateTimeOffset = dateToDisplay
      Return DisplayDate(displayOffsetDate, culture)
   End Function

   Public Function DisplayDate(dateToDisplay As DateTimeOffset, _
                               culture As CultureInfo) As String
      Dim specifier As String = "yyyy/MM/dd"

      If Me.CalendarExists(culture) Then
         Console.WriteLine("Displaying date in supported {0} calendar...", _
                           thisCalendar.GetType().Name)
         culture.DateTimeFormat.Calendar = Me.thisCalendar
         Return dateToDisplay.ToString(specifier, culture)
      Else
         Console.WriteLine("Displaying date in unsupported {0} calendar...", _
                           thisCalendar.GetType().Name)

         Dim separator As String = targetCulture.DateTimeFormat.DateSeparator

         Return thisCalendar.GetYear(dateToDisplay.DateTime).ToString("0000") & separator & _
                thisCalendar.GetMonth(dateToDisplay.DateTime).ToString("00") & separator & _
                thisCalendar.GetDayOfMonth(dateToDisplay.DateTime).ToString("00") 
      End If             
   End Function
End Class
' The example displays the following output to the console:
'       Using the system default culture: 7/3/2008
'       Using the ar-JO culture's original default calendar: 03/07/2008
'       Using the ar-JO culture with Hijri as the default calendar:
'       Displaying date in supported HijriCalendar calendar...
'       1429/06/29
'       Displaying date in supported HijriCalendar calendar...
'       1429/06/29
'       
'       Using the ir-FA culture's default calendar: 7/3/2008
'       Displaying date in unsupported PersianCalendar calendar...
'       1387/04/13
'       Displaying date in unsupported PersianCalendar calendar...
'       1387/04/13
using System;
using System.Globalization;

public class CalendarDates
{
   public static void Main()
   {
      HijriCalendar hijriCal = new HijriCalendar();
      CalendarUtility hijriUtil = new CalendarUtility(hijriCal);
      DateTime hijriDate1 = new DateTime(1429, 6, 29, hijriCal);
      DateTimeOffset hijriDate2 = new DateTimeOffset(hijriDate1, 
                                  TimeZoneInfo.Local.GetUtcOffset(hijriDate1));
      CultureInfo jc = CultureInfo.CreateSpecificCulture("ar-JO");

      // Display the date using the Gregorian calendar.
      Console.WriteLine("Using the system default culture: {0}", 
                        hijriDate1.ToString("d"));
      // Display the date using the ar-JO culture's original default calendar.
      Console.WriteLine("Using the ar-JO culture's original default calendar: {0}", 
                        hijriDate1.ToString("d", jc));
      // Display the date using the Hijri calendar.
      Console.WriteLine("Using the ar-JO culture with Hijri as the default calendar:");
      // Display a Date value.
      Console.WriteLine(hijriUtil.DisplayDate(hijriDate1, jc));
      // Display a DateTimeOffset value.
      Console.WriteLine(hijriUtil.DisplayDate(hijriDate2, jc));

      Console.WriteLine();

      PersianCalendar persianCal = new PersianCalendar();
      CalendarUtility persianUtil = new CalendarUtility(persianCal);
      CultureInfo ic = CultureInfo.CreateSpecificCulture("fa-IR");

      // Display the date using the ir-FA culture's default calendar.
      Console.WriteLine("Using the ir-FA culture's default calendar: {0}",       
                        hijriDate1.ToString("d", ic));
      // Display a Date value.
      Console.WriteLine(persianUtil.DisplayDate(hijriDate1, ic));
      // Display a DateTimeOffset value.
      Console.WriteLine(persianUtil.DisplayDate(hijriDate2, ic));
   }
}

public class CalendarUtility
{
   private Calendar thisCalendar;
   private CultureInfo targetCulture;

   public CalendarUtility(Calendar cal)
   {
      this.thisCalendar = cal;
   }

   private bool CalendarExists(CultureInfo culture)
   {
      this.targetCulture = culture;
      return Array.Exists(this.targetCulture.OptionalCalendars, 
                          this.HasSameName);
   }

   private bool HasSameName(Calendar cal)
   {
      if (cal.ToString() == thisCalendar.ToString())
         return true;
      else
         return false;
   }

   public string DisplayDate(DateTime dateToDisplay, CultureInfo culture)
   {
      DateTimeOffset displayOffsetDate = dateToDisplay;
      return DisplayDate(displayOffsetDate, culture);
   }

   public string DisplayDate(DateTimeOffset dateToDisplay, 
                             CultureInfo culture)
   {
      string specifier = "yyyy/MM/dd";

      if (this.CalendarExists(culture))
      {
         Console.WriteLine("Displaying date in supported {0} calendar...", 
                           this.thisCalendar.GetType().Name);
         culture.DateTimeFormat.Calendar = this.thisCalendar;
         return dateToDisplay.ToString(specifier, culture);
      }
      else
      {
         Console.WriteLine("Displaying date in unsupported {0} calendar...", 
                           thisCalendar.GetType().Name);

         string separator = targetCulture.DateTimeFormat.DateSeparator;

         return thisCalendar.GetYear(dateToDisplay.DateTime).ToString("0000") +
                separator +
                thisCalendar.GetMonth(dateToDisplay.DateTime).ToString("00") + 
                separator +
                thisCalendar.GetDayOfMonth(dateToDisplay.DateTime).ToString("00"); 
      }
   } 
}
// The example displays the following output to the console:
//       Using the system default culture: 7/3/2008
//       Using the ar-JO culture's original default calendar: 03/07/2008
//       Using the ar-JO culture with Hijri as the default calendar:
//       Displaying date in supported HijriCalendar calendar...
//       1429/06/29
//       Displaying date in supported HijriCalendar calendar...
//       1429/06/29
//       
//       Using the ir-FA culture's default calendar: 7/3/2008
//       Displaying date in unsupported PersianCalendar calendar...
//       1387/04/13
//       Displaying date in unsupported PersianCalendar calendar...
//       1387/04/13

Chaque objet CultureInfo peut prendre en charge un ou plusieurs calendriers, indiqués par la propriété OptionalCalendars. L'un d'eux est désigné comme calendrier par défaut de la culture et est retourné par la propriété CultureInfo.Calendar en lecture seule. Il est possible de désigner un autre calendrier facultatif comme calendrier par défaut en assignant un objet Calendar représentant ce calendrier à la propriété DateTimeFormatInfo.Calendar retournée par la propriété CultureInfo.DateTimeFormat. Toutefois, certains calendriers, tels que le calendrier persan représenté par la classe PersianCalendar, ne peuvent pas être utilisés comme calendriers facultatifs, quelle que soit la culture.

L'exemple définit une classe utilitaire de calendrier réutilisable CalendarUtility pour gérer de nombreux détails de la génération de la représentation d'une date sous forme de chaîne à l'aide d'un calendrier particulier. La classe CalendarUtility possède les membres suivants :

  • Un constructeur paramétré dont le paramètre unique est un objet Calendar dans lequel une date sera représentée. Il est assigné à un champ privé de la classe.

  • CalendarExists, méthode privée qui retourne une valeur booléenne indiquant si le calendrier représenté par l'objet CalendarUtility est pris en charge par l'objet CultureInfo passé à la méthode comme paramètre. La méthode encapsule un appel à la méthode Array.Exists<T> à laquelle le tableau CultureInfo.OptionalCalendars est passé.

  • HasSameName, méthode privée assignée au délégué Predicate<T> passé comme paramètre à la méthode Array.Exists<T>. Chaque membre du tableau est passé à la méthode jusqu'à ce que cette dernière retourne la valeur true. La méthode détermine si le nom d'un calendrier facultatif est identique à celui du calendrier représenté par l'objet CalendarUtility.

  • DisplayDate, méthode publique surchargée à laquelle deux paramètres sont passés : une valeur DateTime ou DateTimeOffset à exprimer dans le calendrier représenté par l'objet CalendarUtility et la culture dont les règles de mise en forme seront utilisées. Le comportement adopté pour retourner la représentation d'une date sous forme de chaîne varie selon que le calendrier cible est pris en charge ou non par la culture dont les règles de mise en forme seront utilisées.

La valeur DateTime ou DateTimeOffset est généralement exprimée sous la forme d'une date grégorienne, quel que soit le calendrier utilisé pour la créer. En effet, les types DateTime et DateTimeOffset ne conservent aucune information de calendrier. En interne, cela correspond au nombre de graduations qui se sont écoulées depuis le 1er janvier 0001, à minuit. L'interprétation de ce nombre dépend du calendrier. Pour la plupart des cultures, le calendrier par défaut est le calendrier grégorien.

Compilation du code

Cet exemple requiert une référence à System.Core.dll.

Compilez le code sur la ligne de commande à l'aide de csc.exe ou vb.exe. Pour compiler le code dans Visual Studio, placez-le dans un modèle de projet d'application console.

Voir aussi

Concepts

Exécution d'opérations de mise en forme