Delen via


Procedure: Datums weergeven in niet-Gregoriaanse kalenders

De DateTime en DateTimeOffset typen gebruiken de Gregoriaanse kalender als standaardkalender. Dit betekent dat bij het aanroepen van de methode van ToString een datum- en tijdwaarde de tekenreeksweergave van die datum en tijd in de Gregoriaanse kalender wordt weergegeven, zelfs als die datum en tijd zijn gemaakt met een andere kalender. Dit wordt geïllustreerd in het volgende voorbeeld, dat gebruikmaakt van twee verschillende manieren om een datum- en tijdwaarde te maken met de Perzische kalender, maar nog steeds die datum- en tijdwaarden in de Gregoriaanse kalender weergeeft wanneer deze de ToString methode aanroept. In dit voorbeeld worden twee veelgebruikte maar onjuiste technieken voor het weergeven van de datum in een bepaalde agenda weergegeven.

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

Er kunnen twee verschillende technieken worden gebruikt om de datum in een bepaalde kalender weer te geven. De eerste vereist dat de agenda de standaardagenda voor een bepaalde cultuur is. De tweede kan worden gebruikt met elke kalender.

De datum voor de standaardagenda van een cultuur weergeven

  1. Instantieer een agendaobject dat is afgeleid van de Calendar klasse die de agenda vertegenwoordigt die moet worden gebruikt.

  2. Instantieer een CultureInfo object dat de cultuur aangeeft waarvan de opmaak wordt gebruikt om de datum weer te geven.

  3. Roep de Array.Exists methode aan om te bepalen of het kalenderobject lid is van de matrix die door de CultureInfo.OptionalCalendars eigenschap wordt geretourneerd. Dit geeft aan dat de agenda kan fungeren als de standaardkalender voor het CultureInfo object. Als deze geen lid is van de matrix, volgt u de instructies in de sectie 'De datum weergeven in een willekeurige agenda'.

  4. Wijs het agendaobject toe aan de Calendar eigenschap van het DateTimeFormatInfo object dat door de CultureInfo.DateTimeFormat eigenschap wordt geretourneerd.

    Notitie

    De CultureInfo klasse heeft ook een Calendar eigenschap. Het is echter alleen-lezen en constant; deze wordt niet aangepast aan de nieuwe standaardagenda die aan de DateTimeFormatInfo.Calendar eigenschap is toegewezen.

  5. Roep de ToString of de ToString methode aan en geef dit door aan het CultureInfo object waarvan de standaardkalender in de vorige stap is gewijzigd.

De datum in een agenda weergeven

  1. Instantieer een agendaobject dat is afgeleid van de Calendar klasse die de agenda vertegenwoordigt die moet worden gebruikt.

  2. Bepaal welke datum- en tijdelementen moeten worden weergegeven in de tekenreeksweergave van de datum- en tijdwaarde.

  3. Voor elk datum- en tijdelement dat u wilt weergeven, roept u de ...Get Methode. De volgende methoden zijn beschikbaar:

    • GetYearom het jaar weer te geven in de juiste kalender.

    • GetMonthom de maand in de juiste agenda weer te geven.

    • GetDayOfMonthom het aantal dagen van de maand in de juiste kalender weer te geven.

    • GetHourom het uur van de dag weer te geven in de juiste agenda.

    • GetMinuteom de minuten in het uur in de desbetreffende agenda weer te geven.

    • GetSecond, om de seconden in de minuut in de juiste agenda weer te geven.

    • GetMilliseconds, om de milliseconden in de tweede in de juiste kalender weer te geven.

Opmerking

In het voorbeeld wordt een datum weergegeven met twee verschillende agenda's. De datum wordt weergegeven nadat de Hijri-kalender is gedefinieerd als de standaardkalender voor de ar-JO-cultuur en geeft de datum weer met behulp van de Perzische kalender, die niet wordt ondersteund als een optionele kalender door de fa-IR-cultuur.

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

Elk CultureInfo object kan een of meer agenda's ondersteunen, die worden aangegeven door de OptionalCalendars eigenschap. Een van deze wordt aangewezen als de standaardagenda van de cultuur en wordt geretourneerd door de eigenschap Alleen-lezen CultureInfo.Calendar . Een andere van de optionele agenda's kan standaard worden aangewezen door een Calendar object toe te wijzen dat de agenda aan de DateTimeFormatInfo.Calendar eigenschap vertegenwoordigt die door de CultureInfo.DateTimeFormat eigenschap wordt geretourneerd. Sommige kalenders, zoals de Perzische kalender die door de PersianCalendar klas worden vertegenwoordigd, dienen echter niet als optionele kalenders voor elke cultuur.

In het voorbeeld wordt een herbruikbare klasse voor kalenderhulpprogramma's gedefinieerd voor CalendarUtilityhet verwerken van veel details van het genereren van de tekenreeksweergave van een datum met behulp van een bepaalde kalender. De CalendarUtility klasse heeft de volgende leden:

  • Een geparameteriseerde constructor waarvan één parameter een Calendar object is waarin een datum moet worden weergegeven. Dit wordt toegewezen aan een privéveld van de klasse.

  • CalendarExists, een privémethode die een Booleaanse waarde retourneert die aangeeft of de kalender die wordt vertegenwoordigd door het CalendarUtility object wordt ondersteund door het CultureInfo object dat als parameter wordt doorgegeven aan de methode. De methode verpakt een aanroep naar de Array.Exists methode waaraan de CultureInfo.OptionalCalendars matrix wordt doorgegeven.

  • HasSameName, een privémethode die is toegewezen aan de Predicate<T> gemachtigde die als parameter aan de Array.Exists methode wordt doorgegeven. Elk lid van de matrix wordt doorgegeven aan de methode totdat de methode wordt geretourneerd true. De methode bepaalt of de naam van een optionele agenda gelijk is aan de kalender die wordt vertegenwoordigd door het CalendarUtility object.

  • DisplayDate, een overbelaste openbare methode die twee parameters doorgeeft: een DateTime of DateTimeOffset waarde die wordt uitgedrukt in de kalender die wordt vertegenwoordigd door het CalendarUtility object; en de cultuur waarvan de opmaakregels moeten worden gebruikt. Het gedrag bij het retourneren van de tekenreeksweergave van een datum is afhankelijk van of de doelkalender wordt ondersteund door de cultuur waarvan de opmaakregels moeten worden gebruikt.

Ongeacht de kalender die wordt gebruikt om een DateTime of DateTimeOffset meer waarden te maken in dit voorbeeld, wordt die waarde meestal uitgedrukt als een Gregoriaanse datum. Dit komt doordat de DateTime en DateTimeOffset typen geen agendagegevens behouden. Intern worden ze weergegeven als het aantal tikken dat is verstreken sinds middernacht van 1 januari 0001. De interpretatie van dat getal is afhankelijk van de kalender. Voor de meeste culturen is de standaardkalender de Gregoriaanse kalender.