Vorgehensweise: Anzeigen von Datumsangaben in nicht gregorianischen KalendernHow to: Display Dates in Non-Gregorian Calendars

Die Typen DateTime und DateTimeOffset verwenden den gregorianischen Kalender als Standardkalender.The DateTime and DateTimeOffset types use the Gregorian calendar as their default calendar. Das bedeutet, dass ein Aufruf der ToString-Methode eines Datums- und Uhrzeitwerts die Zeichenfolgendarstellung dieses Datums und dieser Uhrzeit im gregorianischen Kalender anzeigt, selbst wenn dieses Datum und diese Uhrzeit in einem anderen Kalender erstellt wurden.This means that calling a date and time value's ToString method displays the string representation of that date and time in the Gregorian calendar, even if that date and time was created using another calendar. Dies wird im folgenden Beispiel veranschaulicht. Hierbei werden zwei verschiedene Möglichkeiten verwendet, um einen Datums- und Uhrzeitwert mit dem persischen Kalender zu erstellen. Beim Aufruf der ToString-Methode werden diese Datums- und Uhrzeitwerte aber weiterhin im gregorianischen Kalender angezeigt.This is illustrated in the following example, which uses two different ways to create a date and time value with the Persian calendar, but still displays those date and time values in the Gregorian calendar when it calls the ToString method. Dieses Beispiel zeigt zwei häufig verwendete, aber falsche Verfahren zum Anzeigen des Datums in einem bestimmten Kalender.This example reflects two commonly used but incorrect techniques for displaying the date in a particular calendar.

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

Zum Anzeigen des Datums in einem bestimmten Kalender können zwei verschiedene Verfahren verwendet werden.Two different techniques can be used to display the date in a particular calendar. Für das erste Verfahren muss der Kalender der Standardkalender für eine bestimmte Kultur sein.The first requires that the calendar be the default calendar for a particular culture. Das zweite kann mit jedem beliebigen Kalender verwendet werden.The second can be used with any calendar.

Anzeigen des Datums für den Standardkalender einer KulturTo display the date for a culture's default calendar

  1. Instanziieren Sie ein aus der Calendar-Klasse abgeleitetes Kalenderobjekt, das den zu verwendenden Kalender darstellt.Instantiate a calendar object derived from the Calendar class that represents the calendar to be used.

  2. Instanziieren Sie ein CultureInfo-Objekt, das die Kultur darstellt, deren Formatierung für die Datumsanzeige verwendet wird.Instantiate a CultureInfo object representing the culture whose formatting will be used to display the date.

  3. Rufen Sie die Array.Exists-Methode auf, um zu ermitteln, ob das Kalenderobjekt ein Member des von der CultureInfo.OptionalCalendars-Eigenschaft zurückgegebenen Arrays ist.Call the Array.Exists method to determine whether the calendar object is a member of the array returned by the CultureInfo.OptionalCalendars property. Wenn dies der Fall ist, kann der Kalender als Standardkalender für das CultureInfo-Objekt dienen.This indicates that the calendar can serve as the default calendar for the CultureInfo object. Wenn das Objekt kein Member des Arrays ist, befolgen Sie die Anweisungen im Abschnitt „Anzeigen des Datums in einem beliebigen Kalender“.If it is not a member of the array, follow the instructions in the "To Display the Date in Any Calendar" section.

  4. Weisen Sie das Kalenderobjekt zu, um die von der CultureInfo.DateTimeFormat-Eigenschaft zurückgegebene Calendar-Eigenschaft des DateTimeFormatInfo-Objekts festzulegen.Assign the calendar object to the Calendar property of the DateTimeFormatInfo object returned by the CultureInfo.DateTimeFormat property.

    Hinweis

    Die CultureInfo-Klasse verfügt auch über eine Calendar-Eigenschaft.The CultureInfo class also has a Calendar property. Diese ist jedoch schreibgeschützt und konstant. Sie ändert sich nicht, um den neuen, der DateTimeFormatInfo.Calendar-Eigenschaft zugewiesenen Standardkalender widerzuspiegeln.However, it is read-only and constant; it does not change to reflect the new default calendar assigned to the DateTimeFormatInfo.Calendar property.

  5. Rufen Sie entweder die ToString- oder ToString-Methode auf, und übergeben Sie ihr das CultureInfo-Objekt, dessen Standardkalender im vorherigen Schritt geändert wurde.Call either the ToString or the ToString method, and pass it the CultureInfo object whose default calendar was modified in the previous step.

Anzeigen des Datums in einem beliebigen KalenderTo display the date in any calendar

  1. Instanziieren Sie ein aus der Calendar-Klasse abgeleitetes Kalenderobjekt, das den zu verwendenden Kalender darstellt.Instantiate a calendar object derived from the Calendar class that represents the calendar to be used.

  2. Bestimmen Sie, welche Datums- und Uhrzeitelemente in der Zeichenfolgendarstellung des Datums- und Uhrzeitwerts angezeigt werden sollen.Determine which date and time elements should appear in the string representation of the date and time value.

  3. Rufen Sie für jedes Datums- und Uhrzeitelement, das Sie anzeigen möchten, die Get...For each date and time element that you want to display, call the calendar object's Get -Methode.method. Die folgenden Methoden sind verfügbar:The following methods are available:

    • GetYear zum Anzeigen des Jahrs im entsprechenden KalenderGetYear, to display the year in the appropriate calendar.

    • GetMonth zum Anzeigen des Monats im entsprechenden KalenderGetMonth, to display the month in the appropriate calendar.

    • GetDayOfMonth zum Anzeigen der Zahl, die dem Tag des Monats im entsprechenden Kalender entsprichtGetDayOfMonth, to display the number of the day of the month in the appropriate calendar.

    • GetHour zum Anzeigen der Stunde des Tages im entsprechenden KalenderGetHour, to display the hour of the day in the appropriate calendar.

    • GetMinute zum Anzeigen der Minuten in der Stunde im entsprechenden KalenderGetMinute, to display the minutes in the hour in the appropriate calendar.

    • GetSecond zum Anzeigen der Sekunden in der Minute im entsprechenden KalenderGetSecond, to display the seconds in the minute in the appropriate calendar.

    • GetMilliseconds zum Anzeigen der Millisekunden in der Sekunde im entsprechenden KalenderGetMilliseconds , to display the milliseconds in the second in the appropriate calendar.

BeispielExample

Das Beispiel zeigt ein Datum mithilfe von zwei verschiedenen Kalendern an.The example displays a date using two different calendars. Es zeigt das Datum an, nachdem der Hijri-Kalender als Standardkalender für die Kultur „ar-JO“ definiert wurde, und es zeigt das Datum unter Verwendung des persischen Kalenders an, der nicht als optionaler Kalender von der fa-IR-Kultur unterstützt wird.It displays the date after defining the Hijri calendar as the default calendar for the ar-JO culture, and displays the date using the Persian calendar, which is not supported as an optional calendar by the fa-IR culture.

using System;
using System.Globalization;

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

      // Display the date using the Gregorian calendar.
      Console.WriteLine("Using the system default culture: {0}", 
                        dateValue1.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}", 
                        dateValue1.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(dateValue1, jc));
      // Display a DateTimeOffset value.
      Console.WriteLine(hijriUtil.DisplayDate(dateValue2, 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}",       
                        dateValue1.ToString("d", ic));
      // Display a Date value.
      Console.WriteLine(persianUtil.DisplayDate(dateValue1, ic));
      // Display a DateTimeOffset value.
      Console.WriteLine(persianUtil.DisplayDate(dateValue2, 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
Imports System.Globalization

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

      ' Display the date using the Gregorian calendar.
      Console.WriteLine("Using the system default culture: {0}", _
                        dateValue1.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}", _
                        dateValue1.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(dateValue1, jc))
      ' Display a DateTimeOffset value.
      Console.WriteLine(hijriUtil.DisplayDate(dateValue2, 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}", _      
                        dateValue1.ToString("d", ic))
      ' Display a Date value.
      Console.WriteLine(persianUtil.DisplayDate(dateValue1, ic))
      ' Display a DateTimeOffset value.
      Console.WriteLine(persianUtil.DisplayDate(dateValue2, 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

Jedes CultureInfo-Objekt kann mindestens einen Kalender unterstützen, der von der OptionalCalendars-Eigenschaft angegeben wird.Each CultureInfo object can support one or more calendars, which are indicated by the OptionalCalendars property. Einer dieser Kalender ist als Standardkalender der Kultur festgelegt und wird von der schreibgeschützten CultureInfo.Calendar-Eigenschaft zurückgegeben.One of these is designated as the culture's default calendar and is returned by the read-only CultureInfo.Calendar property. Ein anderer der optionalen Kalender kann als Standard festgelegt werden, indem ein Calendar-Objekt, das diesen Kalender darstellt, der von der CultureInfo.DateTimeFormat-Eigenschaft zurückgegebenen DateTimeFormatInfo.Calendar-Eigenschaft zugewiesen wird.Another of the optional calendars can be designated as the default by assigning a Calendar object that represents that calendar to the DateTimeFormatInfo.Calendar property returned by the CultureInfo.DateTimeFormat property. Einige Kalender jedoch, wie der von der PersianCalendar-Klasse dargestellte persische Kalender, dienen nicht als optionale Kalender für irgendeine Kultur.However, some calendars, such as the Persian calendar represented by the PersianCalendar class, do not serve as optional calendars for any culture.

Das Beispiel definiert eine wiederverwendbare Kalenderhilfsprogrammklasse, CalendarUtility, um viele der Details beim Generieren der Zeichenfolgendarstellung eines Datums mithilfe eines bestimmten Kalenders zu verarbeiten.The example defines a reusable calendar utility class, CalendarUtility, to handle many of the details of generating the string representation of a date using a particular calendar. Die CalendarUtility-Klasse verfügt über die folgenden Member:The CalendarUtility class has the following members:

  • Einen parametrisierten Konstruktor, dessen einziger Parameter ein Calendar-Objekt ist, in dem ein Datum dargestellt werden soll.A parameterized constructor whose single parameter is a Calendar object in which a date is to be represented. Dieser wird einem privaten Klassenfeld zugewiesen.This is assigned to a private field of the class.

  • CalendarExists, eine private Methode, die einen booleschen Wert zurückgibt, um anzugeben, ob der durch das CalendarUtility-Objekt dargestellte Kalender von dem CultureInfo-Objekt unterstützt wird, das als Parameter an die Methode übergeben wird.CalendarExists, a private method that returns a Boolean value indicating whether the calendar represented by the CalendarUtility object is supported by the CultureInfo object that is passed to the method as a parameter. Die Methode umschließt einen Aufruf der Array.Exists-Methode, an die das CultureInfo.OptionalCalendars-Array übergeben wird.The method wraps a call to the Array.Exists method, to which it passes the CultureInfo.OptionalCalendars array.

  • HasSameName, eine dem Predicate<T>-Delegaten zugewiesene private Methode, die als Parameter an die Array.Exists-Methode übergeben wird.HasSameName, a private method assigned to the Predicate<T> delegate that is passed as a parameter to the Array.Exists method. Jeder Member des Arrays wird an die Methode übergeben, bis die Methode true zurückgibt.Each member of the array is passed to the method until the method returns true. Die Methode bestimmt, ob der Name eines optionalen Kalenders dem Kalender entspricht, der durch das CalendarUtility-Objekt dargestellt wird.The method determines whether the name of an optional calendar is the same as the calendar represented by the CalendarUtility object.

  • DisplayDate, eine überladene öffentliche Methode, an die zwei Parameter übergeben werden: erstens entweder ein DateTime- oder ein DateTimeOffset-Wert, der in dem durch das CalendarUtility-Objekt dargestellten Kalender ausgedrückt werden soll. Zweitens wird die Kultur übergeben, deren Formatierungsregeln verwendet werden sollen.DisplayDate, an overloaded public method that is passed two parameters: either a DateTime or DateTimeOffset value to express in the calendar represented by the CalendarUtility object; and the culture whose formatting rules are to be used. Das Verhalten bei der Rückgabe der Zeichenfolgendarstellung eines Datums richtet sich danach, ob der Zielkalender von der Kultur unterstützt wird, deren Formatierungsregeln verwendet werden sollen.Its behavior in returning the string representation of a date depends on whether the target calendar is supported by the culture whose formatting rules are to be used.

Unabhängig von dem Kalender, der in diesem Beispiel zum Erstellen eines DateTime- oder DateTimeOffset-Werts verwendet wird, wird dieser Wert üblicherweise als gregorianisches Datum ausgedrückt.Regardless of the calendar used to create a DateTime or DateTimeOffset value in this example, that value is typically expressed as a Gregorian date. Dies liegt daran, dass die Typen DateTime und DateTimeOffset keine Kalenderinformationen beibehalten.This is because the DateTime and DateTimeOffset types do not preserve any calendar information. Intern werden sie als Anzahl von Zeiteinheiten (Ticks) dargestellt, die seit Mitternacht des 1. Januar 0001 verstrichen sind.Internally, they are represented as the number of ticks that have elapsed since midnight of January 1, 0001. Die Interpretation dieser Zahl hängt vom Kalender ab.The interpretation of that number depends on the calendar. In den meisten Kulturen ist der Gregorianische Kalender der Standardkalender.For most cultures, the default calendar is the Gregorian calendar.

Siehe auchSee also