Nasıl yapılır: Miladi Olmayan Takvimlerde Tarihleri Görüntüleme

DateTime ve DateTimeOffset türleri, gregoryen takvimi varsayılan takvim olarak kullanır. Bu, tarih ve saat başka bir takvim kullanılarak oluşturulmuş olsa bile, tarih ve saat değerinin ToString yöntemini çağırmanın Gregoryen takvimde bu tarih ve saatin dize gösterimini görüntülediği anlamına gelir. Bu, Farsça takvimle tarih ve saat değeri oluşturmak için iki farklı yol kullanan ancak yine de yöntemi çağırdığında ToString Gregoryen takvimde bu tarih ve saat değerlerini görüntüleyen aşağıdaki örnekte gösterilmiştir. Bu örnek, tarihi belirli bir takvimde görüntülemek için yaygın olarak kullanılan ancak yanlış olan iki tekniği yansıtır.

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

Tarihi belirli bir takvimde görüntülemek için iki farklı teknik kullanılabilir. İlki, takvimin belirli bir kültür için varsayılan takvim olmasını gerektirir. İkincisi herhangi bir takvimle kullanılabilir.

Bir kültürün varsayılan takvim tarihini görüntülemek için

  1. Kullanılacak takvimi temsil eden sınıfından Calendar türetilmiş bir takvim nesnesinin örneğini oluşturma.

  2. Tarihi görüntülemek için biçimlendirmesi kullanılacak olan kültürü temsil eden bir CultureInfo nesne örneği oluşturma.

  3. Takvim nesnesinin Array.Exists özelliği tarafından döndürülen dizinin bir üyesi olup olmadığını belirlemek için yöntemini çağırın CultureInfo.OptionalCalendars . Bu, takvimin nesne için varsayılan takvim olarak görev yapabileceklerini CultureInfo gösterir. Dizinin üyesi değilse, "Tarihi Herhangi Bir Takvimde Görüntülemek için" bölümündeki yönergeleri izleyin.

  4. Takvim nesnesini Calendar özelliği tarafından döndürülen nesnenin DateTimeFormatInfo özelliğine atayın CultureInfo.DateTimeFormat .

    Not

    Sınıfın CultureInfo da bir Calendar özelliği vardır. Ancak salt okunur ve sabittir; özelliğine atanan yeni varsayılan takvimi yansıtacak şekilde DateTimeFormatInfo.Calendar değişmez.

  5. ToString veya yöntemini çağırın ToString ve önceki adımda varsayılan takvimi değiştirilmiş olan nesneyi geçirinCultureInfo.

Herhangi bir takvimde tarihi görüntülemek için

  1. Kullanılacak takvimi temsil eden sınıfından Calendar türetilmiş bir takvim nesnesinin örneğini oluşturma.

  2. Tarih ve saat değerinin dize gösteriminde hangi tarih ve saat öğelerinin görüneceğini belirleyin.

  3. Görüntülemek istediğiniz her tarih ve saat öğesi için takvim nesnesinin Get... Yöntem. Aşağıdaki yöntemler kullanılabilir:

    • GetYear, yılı uygun takvimde görüntülemek için.

    • GetMonth, ayı uygun takvimde görüntülemek için.

    • GetDayOfMonth, uygun takvimde ayın gününün numarasını görüntülemek için.

    • GetHourögesini seçerek günün saatini uygun takvimde görüntüleyin.

    • GetMinuteögesini seçin.

    • GetSecond, saniyeleri uygun takvimde dakika olarak görüntülemek için.

    • GetMilliseconds, milisaniyeleri uygun takvimde ikincisinde görüntülemek için.

Örnek

Örnekte iki farklı takvim kullanılarak bir tarih görüntülenir. Hicri takvimini ar-JO kültürü için varsayılan takvim olarak tanımladıktan sonra tarihi ve fa-IR kültürü tarafından isteğe bağlı takvim olarak desteklenmeyen Farsça takvimi kullanarak tarihi görüntüler.

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

Her CultureInfo nesne, özelliği tarafından OptionalCalendars belirtilen bir veya daha fazla takvimi destekleyebilir. Bunlardan biri kültürün varsayılan takvimi olarak belirlenir ve salt CultureInfo.Calendar okunur özelliği tarafından döndürülür. İsteğe bağlı takvimlerden bir diğeri, bu takvimi DateTimeFormatInfo.Calendar temsil eden bir Calendar nesne özelliği tarafından CultureInfo.DateTimeFormat döndürülen özelliğe atanarak varsayılan olarak belirlenebilir. Ancak, sınıfı tarafından PersianCalendar temsil edilen Farsça takvim gibi bazı takvimler, herhangi bir kültür için isteğe bağlı takvimler olarak hizmet vermez.

Örnek, CalendarUtilitybelirli bir takvim kullanarak tarihin dize gösterimini oluşturmanın ayrıntılarının çoğunu işlemek için yeniden kullanılabilir bir takvim yardımcı programı sınıfını tanımlar. sınıfı CalendarUtility aşağıdaki üyelere sahiptir:

  • Tek parametresi bir tarihin temsil edilmesi gereken bir Calendar nesne olan parametreli oluşturucu. Bu, sınıfın özel bir alanına atanır.

  • CalendarExists, nesnesi tarafından CalendarUtility temsil edilen takvimin yönteme parametre olarak geçirilen nesne tarafından CultureInfo desteklenip desteklenmediğini belirten bir Boole değeri döndüren özel bir yöntemdir. yöntemi, diziyi Array.Exists geçirdiği yöntemine bir çağrı sarmalar CultureInfo.OptionalCalendars .

  • HasSameName, yöntemine parametre olarak geçirilen temsilciye Predicate<T>Array.Exists atanmış özel bir yöntemdir. Dizinin her üyesi yöntemi döndürene truekadar yöntemine geçirilir. yöntemi, isteğe bağlı bir takvimin adının nesne tarafından CalendarUtility temsil edilen takvimle aynı olup olmadığını belirler.

  • DisplayDate, iki parametre geçirilen aşırı yüklenmiş bir genel yöntemdir: nesne tarafından CalendarUtility temsil edilen takvimde ifade edilecek bir DateTime veya DateTimeOffset değeri ve biçimlendirme kuralları kullanılacak olan kültür. Tarihin dize gösterimini döndürme davranışı, hedef takvimin biçimlendirme kuralları kullanılacak olan kültür tarafından desteklenip desteklenmediğine bağlıdır.

Bu örnekte veya DateTimeDateTimeOffset değeri oluşturmak için kullanılan takvimden bağımsız olarak, bu değer genellikle Gregoryen tarih olarak ifade edilir. Bunun nedeni ve DateTimeOffset türlerinin DateTime takvim bilgilerini korumamasıdır. Dahili olarak, 1 Ocak 0001'in gece yarısından bu yana geçen kene sayısı olarak temsil edilirler. Bu sayının yorumlanması takvime bağlıdır. Çoğu kültür için varsayılan takvim Gregoryen takvimdir.