Procedura: Visualizzare le date in calendari non gregorianiHow to: Display Dates in Non-Gregorian Calendars

I tipi DateTime e DateTimeOffset e usano il calendario gregoriano come calendario predefinito.The DateTime and DateTimeOffset types use the Gregorian calendar as their default calendar. Ciò significa che la chiamata al metodo ToString di un valore di data e ora visualizza la rappresentazione di stringa di tale data e ora nel calendario gregoriano, anche se la data e l'ora sono state create usando un altro calendario.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. Questo processo viene mostrato nell'esempio seguente, che usa due modi diversi per creare un valore di data e ora con il calendario persiano, continuando a visualizzare questi valori di data e ora nel calendario gregoriano quando viene chiamato il metodo 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. L'esempio riflette due tecniche comuni ma non corrette per la visualizzazione della data in un determinato calendario.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

Per visualizzare la data in un determinato calendario è possibile usare due tecniche differenti.Two different techniques can be used to display the date in a particular calendar. La prima richiede che il calendario sia il calendario predefinito per determinate impostazioni cultura.The first requires that the calendar be the default calendar for a particular culture. La seconda può essere usata con qualsiasi calendario.The second can be used with any calendar.

Per visualizzare la data per il calendario predefinito di determinate impostazione culturaTo display the date for a culture's default calendar

  1. Creare un'istanza di un oggetto calendario derivato dalla classe Calendar che rappresenta il calendario da usare.Instantiate a calendar object derived from the Calendar class that represents the calendar to be used.

  2. Creare un'istanza di un oggetto CultureInfo che rappresenta le impostazioni cultura la cui formattazione verrà usata per visualizzare la data.Instantiate a CultureInfo object representing the culture whose formatting will be used to display the date.

  3. Chiamare il metodo Array.Exists per determinare se l'oggetto calendario è un membro della matrice restituita dalla proprietà 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. Questo indica che il calendario può diventare il calendario predefinito per l'oggetto CultureInfo.This indicates that the calendar can serve as the default calendar for the CultureInfo object. Se non è un membro della matrice, seguire le istruzioni riportate nella sezione "Per visualizzare la data in qualsiasi calendario".If it is not a member of the array, follow the instructions in the "To Display the Date in Any Calendar" section.

  4. Assegnare l'oggetto calendario alla proprietà Calendar dell'oggetto DateTimeFormatInfo restituito dalla proprietà CultureInfo.DateTimeFormat.Assign the calendar object to the Calendar property of the DateTimeFormatInfo object returned by the CultureInfo.DateTimeFormat property.

    Nota

    La classe CultureInfo include anche una proprietà Calendar.The CultureInfo class also has a Calendar property. È tuttavia costante e di sola lettura e non viene modificata per riflettere il nuovo calendario predefinito assegnato alla proprietà 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. Chiamare il metodo ToString o ToString e passare al metodo l'oggetto CultureInfo il cui calendario predefinito è stato modificato nel passaggio precedente.Call either the ToString or the ToString method, and pass it the CultureInfo object whose default calendar was modified in the previous step.

Per visualizzare la data in qualsiasi calendarioTo display the date in any calendar

  1. Creare un'istanza di un oggetto calendario derivato dalla classe Calendar che rappresenta il calendario da usare.Instantiate a calendar object derived from the Calendar class that represents the calendar to be used.

  2. Determinare gli elementi di data e ora da visualizzare nella rappresentazione di stringa del valore di data e ora.Determine which date and time elements should appear in the string representation of the date and time value.

  3. Per ogni elemento di data e ora che si vuole visualizzare, chiamare il metodo Get dell'oggetto calendario.For each date and time element that you want to display, call the calendar object's Get ProcessOnStatus.method. Sono disponibili i metodi seguenti:The following methods are available:

    • GetYear, per visualizzare l'anno nel calendario appropriato.GetYear, to display the year in the appropriate calendar.

    • GetMonth, per visualizzare il mese nel calendario appropriato.GetMonth, to display the month in the appropriate calendar.

    • GetDayOfMonth, per visualizzare il numero del giorno e del mese nel calendario appropriato.GetDayOfMonth, to display the number of the day of the month in the appropriate calendar.

    • GetHour, per visualizzare l'ora del giorno nel calendario appropriato.GetHour, to display the hour of the day in the appropriate calendar.

    • GetMinute, per visualizzare i minuti dell'ora nel calendario appropriato.GetMinute, to display the minutes in the hour in the appropriate calendar.

    • GetSecond, per visualizzare i secondi del minuto nel calendario appropriato.GetSecond, to display the seconds in the minute in the appropriate calendar.

    • GetMilliseconds, per visualizzare i millisecondi del secondo nel calendario appropriato.GetMilliseconds , to display the milliseconds in the second in the appropriate calendar.

EsempioExample

L'esempio visualizza una data usando due calendari diversi.The example displays a date using two different calendars. La data viene visualizzata dopo aver definito il calendario Hijri come calendario predefinito per le impostazioni cultura ar-JO e usando il calendario persiano che non è supportato come calendario facoltativo nelle impostazioni cultura 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

Ogni oggetto CultureInfo può supportare uno o più calendari, indicati dalla proprietà OptionalCalendars.Each CultureInfo object can support one or more calendars, which are indicated by the OptionalCalendars property. Uno di questi è designato come calendario predefinito delle impostazioni cultura e viene restituito dalla proprietà CultureInfo.Calendar di sola lettura.One of these is designated as the culture's default calendar and is returned by the read-only CultureInfo.Calendar property. È possibile designare come predefinito un altro calendario tra quelli facoltativi assegnando un oggetto Calendar che rappresenta il calendario alla proprietà DateTimeFormatInfo.Calendar restituita dalla proprietà CultureInfo.DateTimeFormat.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. Tuttavia, alcuni calendari, ad esempio quello persiano rappresentato dalla classe PersianCalendar, non vengono usati come calendari facoltativi per alcuna delle impostazioni cultura.However, some calendars, such as the Persian calendar represented by the PersianCalendar class, do not serve as optional calendars for any culture.

Nell'esempio viene definita la classe dell'utilità di calendario riutilizzabile CalendarUtility per gestire molti dei dettagli relativi alla generazione della rappresentazione di stringa di una data mediante un determinato calendario.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. La classe CalendarUtility ha i seguenti membri:The CalendarUtility class has the following members:

  • Un costruttore con parametri il cui unico parametro è un oggetto Calendar in cui deve essere rappresentata una data.A parameterized constructor whose single parameter is a Calendar object in which a date is to be represented. Viene assegnato a un campo privato della classe.This is assigned to a private field of the class.

  • CalendarExists, metodo privato che restituisce un valore booleano indicante se il calendario rappresentato dall'oggetto CalendarUtility è supportato dall'oggetto CultureInfo passato al metodo come parametro.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. Il metodo esegue il wrapping di una chiamata al metodo Array.Exists, a cui passa la matrice CultureInfo.OptionalCalendars.The method wraps a call to the Array.Exists method, to which it passes the CultureInfo.OptionalCalendars array.

  • HasSameName, metodo privato assegnato al delegato Predicate<T> che viene passato come parametro al metodo Array.Exists.HasSameName, a private method assigned to the Predicate<T> delegate that is passed as a parameter to the Array.Exists method. Ogni membro della matrice viene passato al metodo finché quest'ultimo non restituisce true.Each member of the array is passed to the method until the method returns true. Il metodo determina se il nome di un calendario facoltativo è identico a quello del calendario rappresentato dall'oggetto CalendarUtility.The method determines whether the name of an optional calendar is the same as the calendar represented by the CalendarUtility object.

  • DisplayDate, metodo pubblico in overload a cui vengono passati due parametri: un valore DateTime o DateTimeOffset da esprimere nel calendario rappresentato dall'oggettoCalendarUtility e le impostazioni cultura di cui usare le regole di formattazione.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. Il comportamento nella restituzione della rappresentazione di stringa di una data varia a seconda che il calendario di destinazione sia supportato dalle impostazioni cultura le cui regole di formattazione devono essere usate.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.

Indipendentemente dal calendario usato per creare un valore DateTime o DateTimeOffset in questo esempio, il valore viene in genere espresso come data del calendario gregoriano.Regardless of the calendar used to create a DateTime or DateTimeOffset value in this example, that value is typically expressed as a Gregorian date. Il motivo è che i tipi DateTime e DateTimeOffset non mantengono le informazioni sul calendario.This is because the DateTime and DateTimeOffset types do not preserve any calendar information. Internamente vengono rappresentati come numero di cicli trascorsi dopo la mezzanotte del 1 gennaio 0001.Internally, they are represented as the number of ticks that have elapsed since midnight of January 1, 0001. L'interpretazione del numero dipende dal calendario.The interpretation of that number depends on the calendar. Per la maggior parte delle impostazioni cultura, il calendario predefinito è il calendario gregoriano.For most cultures, the default calendar is the Gregorian calendar.

Vedere ancheSee also