Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
I DateTime tipi e DateTimeOffset usano il calendario gregoriano come calendario predefinito. Ciò significa che chiamando il metodo ToString
su un valore di data e ora, viene visualizzata la rappresentazione in stringa di quella data e ora nel calendario gregoriano, anche se tale data e ora è stata creata utilizzando un altro calendario. Questo è illustrato nell'esempio seguente, che usa due modi diversi per creare un valore di data e ora con il calendario persiano, ma visualizza comunque i valori di data e ora nel calendario gregoriano quando chiama il ToString metodo . Questo esempio riflette due tecniche comunemente usate ma non corrette per visualizzare la data in un determinato calendario.
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
È possibile usare due tecniche diverse per visualizzare la data in un determinato calendario. Il primo richiede che il calendario sia il calendario predefinito per una cultura specifica. Il secondo può essere utilizzato con qualsiasi calendario.
Per visualizzare la data per il calendario predefinito di una cultura
Creare un'istanza di un oggetto calendario derivato dalla classe Calendar che rappresenta il calendario da utilizzare.
Creare un'istanza di un oggetto CultureInfo che rappresenta le impostazioni della cultura la cui formattazione verrà utilizzata per visualizzare la data.
Chiamare il Array.Exists metodo per determinare se l'oggetto calendario è un membro della matrice restituita dalla CultureInfo.OptionalCalendars proprietà . Ciò indica che il calendario può fungere da calendario predefinito per l'oggetto CultureInfo . Se non è un membro della matrice, seguire le istruzioni nella sezione "Per visualizzare la data in qualsiasi calendario".
Assegna l'oggetto calendario alla proprietà Calendar dell'oggetto DateTimeFormatInfo, che viene restituito dalla proprietà CultureInfo.DateTimeFormat.
Annotazioni
La CultureInfo classe ha anche una Calendar proprietà . Tuttavia, è di sola lettura e costante; non viene modificato in modo da riflettere il nuovo calendario predefinito assegnato alla DateTimeFormatInfo.Calendar proprietà .
Chiamare il metodo ToString o il metodo ToString e passarlo all'oggetto CultureInfo il cui calendario predefinito è stato modificato nel passaggio precedente.
Per visualizzare la data in qualsiasi calendario
Creare un'istanza di un oggetto calendario derivato dalla classe Calendar che rappresenta il calendario da utilizzare.
Determinare quali elementi di data e ora devono essere visualizzati nella rappresentazione di stringa del valore di data e ora.
Per ogni elemento di data e ora che vuoi visualizzare, chiama l'oggetto calendario ...
Get
metodo. Sono disponibili i metodi seguenti:GetYear, per visualizzare l'anno nel calendario appropriato.
GetMonth, per visualizzare il mese nel calendario appropriato.
GetDayOfMonth, per visualizzare il numero del giorno del mese nel calendario appropriato.
GetHour, per visualizzare l'ora del giorno nel calendario appropriato.
GetMinute, per visualizzare i minuti nell'ora nel calendario appropriato.
GetSecond, per visualizzare i secondi nel minuto nel calendario appropriato.
GetMilliseconds, per visualizzare i millisecondi nel secondo nel calendario appropriato.
Esempio
Nell'esempio viene visualizzata una data utilizzando due calendari diversi. Visualizza la data dopo aver definito il calendario Hijri come calendario predefinito per le impostazioni cultura ar-JO e visualizza la data utilizzando il calendario persiano, che non è supportato come calendario facoltativo dalle impostazioni cultura 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: {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: {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: {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 {this.thisCalendar.GetType().Name} calendar...");
culture.DateTimeFormat.Calendar = this.thisCalendar;
return dateToDisplay.ToString(specifier, culture);
}
else
{
Console.WriteLine($"Displaying date in unsupported {thisCalendar.GetType().Name} calendar...");
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 CultureInfo oggetto può supportare uno o più calendari, indicati dalla OptionalCalendars proprietà . Una di queste è designata come calendario predefinito della cultura ed è restituita dalla proprietà di sola lettura CultureInfo.Calendar. Un altro dei calendari facoltativi può essere designato come predefinito assegnando un Calendar oggetto che rappresenta il DateTimeFormatInfo.Calendar calendario alla proprietà restituita dalla CultureInfo.DateTimeFormat proprietà . Tuttavia, alcuni calendari, come il calendario persiano rappresentato dalla classe PersianCalendar, non funzionano come calendari facoltativi per alcuna cultura.
L'esempio definisce una classe di utilità di calendario riutilizzabile, CalendarUtility
, per gestire molti dei dettagli della generazione della rappresentazione di stringa di una data usando un calendario specifico. La classe CalendarUtility
ha i membri seguenti:
Costruttore con parametri il cui singolo parametro è un Calendar oggetto in cui deve essere rappresentata una data. Questo oggetto viene assegnato a un campo privato della classe .
CalendarExists
, un metodo privato che restituisce un valore booleano che indica se il calendario rappresentato dall'oggetto è supportato dall'oggettoCalendarUtility
CultureInfo passato al metodo come parametro. Il metodo avvolge una chiamata al metodo Array.Exists, a cui passa l'array CultureInfo.OptionalCalendars.HasSameName
, un metodo privato assegnato al Predicate<T> delegato passato come parametro al Array.Exists metodo . Ogni membro della matrice viene passato al metodo fino a quando il metodo non restituiscetrue
. Il metodo determina se il nome di un calendario facoltativo corrisponde al calendario rappresentato dall'oggettoCalendarUtility
.DisplayDate
, un metodo pubblico sovraccarico che accetta due parametri: un valore DateTime o DateTimeOffset da esprimere nel calendario rappresentato dall'oggettoCalendarUtility
e la cultura le cui regole di formattazione devono essere utilizzate. Il comportamento nel restituire la rappresentazione in stringa di una data dipende dal fatto che il calendario di destinazione sia supportato dalla cultura le cui regole di formattazione devono essere utilizzate.
Indipendentemente dal calendario usato per creare un DateTime valore o DateTimeOffset in questo esempio, tale valore viene in genere espresso come data gregoriana. Ciò è dovuto al fatto che i DateTime tipi e DateTimeOffset non conservano informazioni sul calendario. Internamente, sono rappresentati come il numero di tick trascorsi dalla mezzanotte del 1° gennaio 0001. L'interpretazione di tale numero dipende dal calendario. Per la maggior parte delle culture, il calendario predefinito è il calendario gregoriano.