Sdílet prostřednictvím


Postupy: Zobrazení dat v jiných než gregoriánských kalendářích

Typy DateTime a DateTimeOffset používají gregoriánský kalendář jako svůj výchozí kalendář. To znamená, že volání metody ToString hodnot data a času zobrazuje řetězcové vyjádření daného data a času v gregoriánském kalendáři, a to dokonce i když byl datum a čas vytvořen pomocí jiného kalendáře. To je znázorněno v následujícím příkladu, který používá dva různé způsoby pro vytvoření hodnoty data a času pomocí perského kalendáře, ale stále zobrazuje tyto hodnoty data a času v gregoriánském kalendáři, když volá metodu ToString. V tomto příkladu jsou ukázány dvě běžně používané, ale nesprávné pro zobrazení data v určitém kalendáři.

������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

Lze použít dvě různé techniky pro zobrazení data v určitém kalendáři. První vyžaduje, aby byl kalendář výchozím kalendářem pro konkrétní jazykovou verzi. Druhý lze použít s libovolným kalendářem.

Zobrazení data pro výchozí kalendář jazykové verze

  1. Vytvořte instanci objektu kalendáře odvozeného z třídy Calendar, která představuje kalendář, který chcete použít.

  2. Vytvořte instanci objektu CultureInfo představující jazykovou verzi, jejíž formátování bude použito k zobrazení data.

  3. Voláním metody Array.Exists<T> zjistíte, zda je objekt kalendáře členem pole vráceného vlastností CultureInfo.OptionalCalendars. To znamená, že kalendář může sloužit jako výchozí kalendář pro objekt CultureInfo. Pokud není členem pole, postupujte podle pokynů v oddílu Zobrazení data v libovolném kalendáři.

  4. Přiřaďte objekt kalendáře k vlastnosti Calendar objektu DateTimeFormatInfo vráceného vlastností CultureInfo.DateTimeFormat.

    PoznámkaPoznámka

    Třída CultureInfo má rovněž vlastnost Calendar. Nicméně je jen pro čtení a konstantní. Nezmění se tak, aby odrážela nový výchozí kalendář přiřazený k vlastnosti DateTimeFormatInfo.Calendar.

  5. Volejte buď metodu ToString nebo ToString a předejte ji objekt CultureInfo, jehož výchozí kalendář byl upraven v předchozím kroku.

Zobrazení data v libovolném kalendáři

  1. Vytvořte instance objektu kalendáře odvozeného z třídy Calendar, která představuje kalendář, který chcete použít.

  2. Určete, které prvky data a času se objeví v řetězcové reprezentaci hodnoty data a času.

  3. Volejte metodu Get objektu kalendáře pro každý prvek data a času, který chcete zobrazit. K dispozici jsou následující metody:

    • GetYear, chcete-li zobrazit rok v příslušném kalendáři.

    • GetMonth, chcete-li zobrazit měsíc v příslušném kalendáři.

    • GetDayOfMonth, chcete-li zobrazit číslo dne měsíce v příslušném kalendáři.

    • GetHour, chcete-li zobrazit hodiny dne v příslušném kalendáři.

    • GetMinute, chcete-li zobrazit minuty hodiny v příslušném kalendáři.

    • GetSecond, chcete-li zobrazit sekundy minuty v příslušném kalendáři.

    • GetMilliseconds, chcete-li zobrazit milisekundy sekundy v příslušném kalendáři.

Příklad

Příklad zobrazuje datum pomocí dvou různých kalendářů. Zobrazí datum po definování kalendáře Hidžra jako výchozího kalendáře pro jazykovou verzi ar-JO a zobrazí datum pomocí perského kalendáře, který není podporován jako volitelný kalendář jazykové verze 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

Každý objekt CultureInfo může podporovat jeden nebo více kalendářů, které jsou označeny vlastností OptionalCalendars. Jeden z nich je označen jako výchozí kalendář jazykové verze a je vrácen vlastností jen pro čtení CultureInfo.Calendar. Další z volitelných kalendářů lze označit jako výchozí přiřazením objektu Calendar představujícího tento kalendář vlastnosti DateTimeFormatInfo.Calendar, která je vrácena vlastností CultureInfo.DateTimeFormat. Některé kalendáře, jako je například perský kalendář reprezentovaný třídou PersianCalendar však neslouží jako volitelný kalendář pro žádnou jazykovou verzi.

Příklad definuje znovupoužitelnou třídu nástrojů kalendáře CalendarUtility, aby zpracoval mnoho podrobností generování řetězcové reprezentace data pomocí určitého kalendáře. Třída CalendarUtility má následující členy:

  • Parametrizovaný konstruktor, jehož jedním parametrem je objekt Calendar, ve kterém má být reprezentováno datum. To je přiřazeno soukromému poli třídy.

  • CalendarExists, soukromá metoda, která vrací logickou hodnotu označující, zda je kalendář reprezentován objektem CalendarUtility, který je podporován objektem CultureInfo, který je předán metodě jako parametr. Metoda obalí volání metody Array.Exists<T>, které předá pole CultureInfo.OptionalCalendars.

  • HasSameName, soukromá metoda přiřazená delegátovi Predicate<T>, který je předán jako parametr metodě Array.Exists<T>. Každý člen pole je předán metodě dokud metoda nevrátí true. Tato metoda určí, zda je název volitelného kalendáře stejný jako kalendář představovaný objektem CalendarUtility.

  • DisplayDate, přetížená veřejná metoda, které jsou předány dva parametry: buď hodnota DateTime nebo DateTimeOffset, pro vyjádření v kalendáři reprezentovaném objektem CalendarUtility a jazyková verze, jejíž pravidla formátování mají být použity. Jeho chování, když vrací řetězcovou reprezentaci data záleží na tom, zda je cílový kalendář podporován jazykovou verzí, jejíž pravidla formátování mají být použity.

Bez ohledu na kalendář použitý v tomto příkladu k vytvoření hodnoty DateTime nebo DateTimeOffset, je hodnota obvykle vyjádřena jako gregoriánské datum. Důvodem jsou typy DateTime a DateTimeOffset, které nezachovávají žádné informace kalendáře. Interně jsou reprezentovány jako počet tiků, které uplynuly od půlnoci 1. ledna 0001. Výklad tohoto čísla závisí na kalendáři. Pro většinu jazykových verzí je výchozím kalendářem gregoriánský kalendář.

Probíhá kompilace kódu

Tento příklad vyžaduje odkaz na System.Core.dll.

Kompilujte kód v příkazovém řádku pomocí csc.exe nebo vb.exe. Pro kompilaci kódu ve Visual Studio, vložte kód do šablony projektu pro konzolové aplikace.

Viz také

Koncepty

Provádění operací formátování