方法: グレゴリオ暦以外の暦の日付を表示するHow to: Display Dates in Non-Gregorian Calendars

DateTime 型と DateTimeOffset 型は既定の暦としてグレゴリオ暦を使用しています。The DateTime and DateTimeOffset types use the Gregorian calendar as their default calendar. つまり、日付と時刻値の ToString メソッドを呼び出すと、その日付の時刻が別の暦を使用して作成された場合でも、その日付の時刻はグレゴリオ暦の文字列形式で表示されます。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. これを次の例で示します。この例では、2 つの方法を使用してペルシャ暦で日付と時刻の値を作成していますが、ToString メソッドを呼び出すと、これらの日付と時刻の値はグレゴリオ暦で表示されます。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. この例では、一般的に使われているものの、特定の暦で日付を表示するには正しくない 2 つの手法が反映されています。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

2 つの手法は、特定の暦で日付を表示するために使用できます。Two different techniques can be used to display the date in a particular calendar. 1 番目の手法では、暦は特定のカルチャの既定の暦である必要があります。The first requires that the calendar be the default calendar for a particular culture. 2 番目の手法は、任意の暦で使用できます。The second can be used with any calendar.

カルチャの既定の暦の日付を表示するにはTo display the date for a culture's default calendar

  1. 使用する暦を表す Calendar クラスから派生した暦オブジェクトをインスタンス化します。Instantiate a calendar object derived from the Calendar class that represents the calendar to be used.

  2. 日付を表示するために使用される書式のカルチャを表す CultureInfo オブジェクトをインスタンス化します。Instantiate a CultureInfo object representing the culture whose formatting will be used to display the date.

  3. Array.Exists メソッドを呼び出し、暦オブジェクトが CultureInfo.OptionalCalendars プロパティによって返される配列のメンバーかどうかを判断します。Call the Array.Exists method to determine whether the calendar object is a member of the array returned by the CultureInfo.OptionalCalendars property. これは、暦が CultureInfo オブジェクトの既定の暦として使用できることを示します。This indicates that the calendar can serve as the default calendar for the CultureInfo object. 配列のメンバーでない場合は、「任意の暦で日付を表示するには」セクションの手順に従います。If it is not a member of the array, follow the instructions in the "To Display the Date in Any Calendar" section.

  4. CultureInfo.DateTimeFormat プロパティから返される DateTimeFormatInfo オブジェクトの Calendar プロパティに暦オブジェクトを割り当てます。Assign the calendar object to the Calendar property of the DateTimeFormatInfo object returned by the CultureInfo.DateTimeFormat property.

    注意

    CultureInfo クラスには Calendar プロパティもあります。The CultureInfo class also has a Calendar property. ただし、これは読み取り専用で定数のため、DateTimeFormatInfo.Calendar プロパティに割り当てられた新しい既定の暦を反映するために変更されることはありません。However, it is read-only and constant; it does not change to reflect the new default calendar assigned to the DateTimeFormatInfo.Calendar property.

  5. ToStringToString メソッドのいずれかを呼び出し、前の手順で既定の暦を変更した CultureInfo オブジェクトを渡します。Call either the ToString or the ToString method, and pass it the CultureInfo object whose default calendar was modified in the previous step.

任意の暦で日付を表示するにはTo display the date in any calendar

  1. 使用する暦を表す Calendar クラスから派生した暦オブジェクトをインスタンス化します。Instantiate a calendar object derived from the Calendar class that represents the calendar to be used.

  2. 日付と時刻の値の文字列形式で表示する日付と時刻の要素を決定します。Determine which date and time elements should appear in the string representation of the date and time value.

  3. 表示する日付と時刻の要素ごとに、暦オブジェクトの GetFor each date and time element that you want to display, call the calendar object's Get メソッドをオーバーライドします。method. 次のメソッドが使用できます。The following methods are available:

    • GetYear: 適切な暦で年を表示します。GetYear, to display the year in the appropriate calendar.

    • GetMonth: 適切な暦で月を表示します。GetMonth, to display the month in the appropriate calendar.

    • GetDayOfMonth: 適切な暦で月の日付を表示します。GetDayOfMonth, to display the number of the day of the month in the appropriate calendar.

    • GetHour: 適切な暦で日の時間を表示します。GetHour, to display the hour of the day in the appropriate calendar.

    • GetMinute: 適切な暦で時間の分を表示します。GetMinute, to display the minutes in the hour in the appropriate calendar.

    • GetSecond: 適切な暦で分の秒を表示します。GetSecond, to display the seconds in the minute in the appropriate calendar.

    • GetMilliseconds: 適切な暦で秒のミリ秒を表示します。GetMilliseconds , to display the milliseconds in the second in the appropriate calendar.

Example

この例では、2 つの異なる暦を使用して日付を表示します。The example displays a date using two different calendars. ar-JO カルチャの既定の暦としてイスラム暦を定義した後の日付を表示し、その日付を fa-IR カルチャでオプションの暦としてサポートされていないペルシャ暦を使用して表示します。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

CultureInfo オブジェクトは、OptionalCalendars プロパティに示されている 1 つ以上の暦をサポートできます。Each CultureInfo object can support one or more calendars, which are indicated by the OptionalCalendars property. これらのいずれかがカルチャの既定の暦として指定され、読み取り専用の CultureInfo.Calendar プロパティによって返されます。One of these is designated as the culture's default calendar and is returned by the read-only CultureInfo.Calendar property. オプションの暦のもう 1 つは、その暦を表す Calendar オブジェクトを CultureInfo.DateTimeFormat プロパティによって返された DateTimeFormatInfo.Calendar プロパティに割り当てることで、既定値として指定することができます。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. ただし、PersianCalendar クラスによって表されるペルシャ暦などの一部の暦は、どのカルチャのオプションの暦としても機能しません。However, some calendars, such as the Persian calendar represented by the PersianCalendar class, do not serve as optional calendars for any culture.

例では、特定の暦を使用して日付の文字列形式を生成する詳細の多くを処理するため、再利用可能な暦ユーティリティ クラス CalendarUtility を定義しています。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. CalendarUtility クラスには次のメンバーがあります。The CalendarUtility class has the following members:

  • パラメーター化されたコンストラクター。その単一のパラメーターが Calendar オブジェクトで、この中で日付が表示されます。A parameterized constructor whose single parameter is a Calendar object in which a date is to be represented. これは、クラスのプライベート フィールドに割り当てられます。This is assigned to a private field of the class.

  • CalendarExists は、CalendarUtility オブジェクトによって表される暦が、パラメーターとしてメソッドに渡される CultureInfo オブジェクトによってサポートされているかどうかを示すブール値を返すプライベート メソッドです。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. このメソッドは、CultureInfo.OptionalCalendars 配列が渡される Array.Exists メソッドの呼び出しをラップします。The method wraps a call to the Array.Exists method, to which it passes the CultureInfo.OptionalCalendars array.

  • HasSameName は、パラメーターとして Array.Exists メソッドに渡される Predicate<T> デリゲートに割り当てられるプライベート メソッドです。HasSameName, a private method assigned to the Predicate<T> delegate that is passed as a parameter to the Array.Exists method. メソッドが true を返すまで、配列の各メンバーがメソッドに渡されます。Each member of the array is passed to the method until the method returns true. このメソッドは、オプションの暦の名前が CalendarUtility オブジェクトによって表される暦と同じかどうかを判断します。The method determines whether the name of an optional calendar is the same as the calendar represented by the CalendarUtility object.

  • DisplayDate は、2 つのパラメーターに渡されるオーバーロードされたパブリック メソッドです。DateTime または DateTimeOffset のいずれかの値を CalendarUtility オブジェクトによって表される暦で表し、カルチャの書式指定規則が使用されます。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. 日付の文字列表現を返す際の動作は、ターゲットの暦が、使用される書式指定規則のカルチャでサポートされているかどうかによって異なります。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.

この例では、DateTime または DateTimeOffset 値を作成するために使用する暦に関係なく、その値は通常、グレゴリオ暦の日付として表現されます。Regardless of the calendar used to create a DateTime or DateTimeOffset value in this example, that value is typically expressed as a Gregorian date. これは、DateTimeDateTimeOffset 型は、どの暦情報も保持しないからです。This is because the DateTime and DateTimeOffset types do not preserve any calendar information. これらは内部的に 0001 年 1 月 1 日の午前 0 時から経過したタイマー刻みの数として表されます。Internally, they are represented as the number of ticks that have elapsed since midnight of January 1, 0001. その数の解釈は、暦に依存します。The interpretation of that number depends on the calendar. ほとんどのカルチャでは、既定の暦はグレゴリオ暦です。For most cultures, the default calendar is the Gregorian calendar.

関連項目See also