Share via


Cara: Menampilkan Tanggal di Kalender Non-Gregorian

Jenis DateTime dan DateTimeOffset menggunakan kalender Gregorian sebagai kalender defaultnya. Ini berarti bahwa memanggil metode nilai ToString tanggal dan waktu menampilkan representasi string tanggal dan waktu tersebut di kalender Gregorian, bahkan jika tanggal dan waktu tersebut dibuat menggunakan kalender lain. Ini diilustrasikan dalam contoh berikut, yang menggunakan dua cara berbeda untuk membuat nilai tanggal dan waktu dengan kalender Persia, tetapi masih menampilkan nilai tanggal dan waktu tersebut di kalender Gregorian saat memanggil ToString metode. Contoh ini mencerminkan dua teknik yang umum digunakan tetapi salah untuk menampilkan tanggal dalam kalender tertentu.

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

Dua teknik berbeda dapat digunakan untuk menampilkan tanggal dalam kalender tertentu. Yang pertama mengharuskan kalender menjadi kalender default untuk budaya tertentu. Yang kedua dapat digunakan dengan kalender apa pun.

Untuk menampilkan tanggal kalender default budaya

  1. Membuat instans objek kalender yang berasal dari Calendar kelas yang mewakili kalender yang akan digunakan.

  2. Membuat instans CultureInfo objek yang mewakili budaya yang pemformatannya akan digunakan untuk menampilkan tanggal.

  3. Panggil Array.Exists metode untuk menentukan apakah objek kalender adalah anggota array yang dikembalikan oleh CultureInfo.OptionalCalendars properti. Ini menunjukkan bahwa kalender dapat berfungsi sebagai kalender default untuk CultureInfo objek. Jika bukan anggota array, ikuti instruksi di bagian "Untuk Menampilkan Tanggal di Kalender Apa Pun".

  4. Tetapkan objek kalender ke Calendar properti DateTimeFormatInfo objek yang dikembalikan oleh CultureInfo.DateTimeFormat properti.

    Catatan

    Kelas ini CultureInfo juga memiliki Calendar properti. Namun, itu baca-saja dan konstan; tidak berubah untuk mencerminkan kalender default baru yang ditetapkan ke DateTimeFormatInfo.Calendar properti.

  5. Panggil metode ToString atau ToString, dan berikan CultureInfo objek yang kalender defaultnya diubah pada langkah sebelumnya.

Untuk menampilkan tanggal di kalender mana pun

  1. Membuat instans objek kalender yang berasal dari Calendar kelas yang mewakili kalender yang akan digunakan.

  2. Menentukan elemen tanggal dan waktu mana yang akan muncul dalam representasi string dari nilai tanggal dan waktu.

  3. Untuk setiap elemen tanggal dan waktu yang ingin Anda tampilkan, panggil objek kalender Get… metode. Metode berikut tersedia:

    • GetYear, untuk menampilkan tahun di kalender yang sesuai.

    • GetMonth, untuk menampilkan bulan di kalender yang sesuai.

    • GetDayOfMonth, untuk menampilkan jumlah hari dalam sebulan di kalender yang sesuai.

    • GetHour, untuk menampilkan jam dalam sehari di kalender yang sesuai.

    • GetMinute, untuk menampilkan menit dalam satu jam di kalender yang sesuai.

    • GetSecond, untuk menampilkan detik dalam satu menit di kalender yang sesuai.

    • GetMilliseconds, untuk menampilkan milidetik di yang kedua di kalender yang sesuai.

Contoh

Contoh menampilkan tanggal menggunakan dua kalender yang berbeda. Ini menampilkan tanggal setelah mendefinisikan kalender Hijriah sebagai kalender default untuk budaya ar-JO, dan menampilkan tanggal menggunakan kalender Persia, yang tidak didukung sebagai kalender opsional oleh budaya fa-IR.

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

Setiap CultureInfo objek dapat mendukung satu atau lebih kalender, yang ditunjukkan oleh OptionalCalendars properti. Salah satunya ditetapkan sebagai kalender default budaya dan dikembalikan oleh properti baca-saja CultureInfo.Calendar. Kalender opsional lainnya dapat ditetapkan sebagai default dengan menetapkan Calendar objek yang mewakili kalender tersebut DateTimeFormatInfo.Calendar ke properti yang dikembalikan oleh CultureInfo.DateTimeFormat properti. Namun, beberapa kalender, seperti kalender Persia yang diwakili oleh PersianCalendar kelas, tidak berfungsi sebagai kalender opsional untuk budaya apa pun.

Contoh mendefinisikan kelas utilitas kalender yang dapat digunakan kembali, CalendarUtility, untuk menangani banyak detail pembuatan representasi string tanggal menggunakan kalender tertentu. Kelas CalendarUtility memiliki anggota berikut:

  • Konstruktor berparameter yang parameter tunggalnya adalah Calendar objek di mana tanggal akan diwakili. Ini ditetapkan ke bidang privat kelas.

  • CalendarExists, metode privat yang mengembalikan nilai Boolean yang menunjukkan apakah kalender yang diwakili oleh CalendarUtility objek didukung oleh CultureInfo objek yang diteruskan ke metode sebagai parameter. Metode ini membungkus panggilan ke Array.Exists metode, yang melewati CultureInfo.OptionalCalendars array.

  • HasSameName, metode privat yang ditetapkan ke Predicate<T> delegasi yang diteruskan sebagai parameter ke Array.Exists metode. Setiap anggota array diteruskan ke metode hingga metode mengembalikan true. Metode menentukan apakah nama kalender opsional sama dengan kalender yang diwakili oleh CalendarUtility objek.

  • DisplayDate, metode publik kelebihan beban yang diteruskan dua parameter: baik nilai DateTime atau DateTimeOffset untuk diekspresikan dalam kalender yang diwakili oleh CalendarUtility objek; dan budaya yang aturan pemformatannya akan digunakan. Perilakunya dalam mengembalikan representasi string tanggal tergantung pada apakah kalender target didukung oleh budaya yang aturan pemformatannya akan digunakan.

Terlepas dari kalender yang digunakan untuk membuat nilai DateTime atau DateTimeOffset dalam contoh ini, nilai tersebut biasanya dinyatakan sebagai tanggal Gregorian. Ini karena jenis DateTime dan DateTimeOffset tidak mempertahankan informasi kalender apa pun. Secara internal, mereka diwakili sebagai jumlah tanda yang telah berlalu sejak tengah malam 1 Januari 0001. Interpretasi angka tersebut tergantung pada kalender. Untuk sebagian besar budaya, kalender default adalah kalender Gregorian.