Formattazione di data e ora per specifiche impostazioni cultura
La struttura DateTime offre vari metodi che consentono alle applicazioni di eseguire operazioni dipendenti dalle impostazioni cultura su un tipo DateTime. Mediante l'applicazione è possibile utilizzare la classe DateTimeFormatInfo per formattare e visualizzare un tipo DateTime in base alle impostazioni cultura. Utilizzando DateTimeFormatInfo.ShortDatePattern, ad esempio, il 1° febbraio 2001 può essere formattato come 2/1/2001 per le impostazioni cultura relative alla lingua inglese parlata negli Stati Uniti ("en-US") oppure 01/02/2001 per le impostazioni cultura relative alla lingua inglese parlata nel Regno Unito ("en-GB").
Un oggetto DateTimeFormatInfo può essere creato per impostazioni cultura specifiche oppure per la lingua inglese, ma non per impostazioni cultura non associate ad alcun paese. Le impostazioni cultura non associate ad alcun paese non forniscono informazioni sufficienti per visualizzare il formato di data corretto. Se l'applicazione tenta di creare un oggetto DateTimeFormatInfo utilizzando impostazioni cultura non associate ad alcun paese, viene generata un'eccezione. Per ulteriori informazioni ed esempi sull'uso della formattazione DateTime, vedere Stringhe di formato di data e ora.
Nell'esempio di codice riportato di seguito viene visualizzata la data corrente utilizzando DateTimeFormatInfo.ShortDatePattern quando l'oggetto Thread.CurrentThread delle impostazioni cultura correnti viene impostato sulla lingua inglese parlata negli Stati Uniti ("en-US") e quindi sulla lingua tedesca parlata in Germania ("de-DE").
Imports System
Imports System.Globalization
Imports System.Threading
Public Class FormatDate
Public Shared Sub Main()
Dim dt As DateTime = DateTime.Now
' Sets the CurrentCulture property to U.S. English.
Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
' Displays dt, formatted using the ShortDatePattern
' and the CurrentThread.CurrentCulture.
Console.WriteLine(dt.ToString("d"))
' Creates a CultureInfo for German in Germany.
Dim ci As New CultureInfo("de-DE")
' Displays dt, formatted using the ShortDatePattern
' and the CultureInfo.
Console.WriteLine(dt.ToString("d", ci))
End Sub
End Class
using System;
using System.Globalization;
using System.Threading;
public class FormatDate
{
public static void Main()
{
DateTime dt = DateTime.Now;
// Sets the CurrentCulture property to U.S. English.
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
// Displays dt, formatted using the ShortDatePattern
// and the CurrentThread.CurrentCulture.
Console.WriteLine(dt.ToString("d"));
// Creates a CultureInfo for German in Germany.
CultureInfo ci = new CultureInfo("de-DE");
// Displays dt, formatted using the ShortDatePattern
// and the CultureInfo.
Console.WriteLine(dt.ToString("d", ci));
}
}
Se si esegue questo codice in data 9 luglio 2001, l'output avrà il seguente aspetto:
7/9/2001
09.07.2001
Operazioni con i fusi orari
La struttura DateTime utilizza sempre il fuso orario locale per l'esecuzione di calcoli e confronti. Tenere presente tale considerazione quando l'applicazione utilizza i metodi DateTime.Parse e DateTime.ParseExact. Questi metodi forniscono gli overload che consentono la conversione della rappresentazione in forma di stringa di una data e di un'ora in un tipo DateTime. L'applicazione è inoltre in grado di formattare un tipo DateTime per impostazioni cultura specifiche. Se non viene specificato un fuso orario nella stringa passata a tali metodi, vengono recuperate la data e l'ora analizzate senza eseguire un adattamento al fuso orario. La data e l'ora sono basate sull'impostazione del fuso orario del sistema operativo. Se l'applicazione specifica un offset del fuso orario, i metodi analizzano la stringa data/ora e ne eseguono la conversione in formato UTC (Coordinated Universal Time), noto in precedenza come GMT (Greenwich Mean Time), e quindi nell'ora nel sistema locale.
Per convertire un tipo DateTime locale nell'equivalente UTC, l'applicazione deve utilizzare il metodo DateTime.ToUniversalTime Per analizzare una stringa data/ora ed eseguirne la conversione in un tipo DateTime UTC, l'applicazione dovrebbe utilizzare il valore di enumerazione DateTimeStyles.AdjustToUniversal con il metodo DateTime.Parse o il metodo DateTime.ParseExact.
Nell'esempio di codice riportato di seguito viene creato un tipo DateTime per l'ora locale, quindi viene eseguita la conversione nell'equivalente UTC. Entrambi i tipi vengono convertiti in stringhe e scritti nella console. Si noti che le stringhe differiscono nell'offset UTC tra il fuso orario locale e l'ora UTC. Le stringhe vengono nuovamente convertite nei tipi DateTime utilizzando il metodo DateTime.ParseExact. Per acquisire le informazioni sul fuso orario archiviate in utcdt, è necessario specificare il valore DateTimeStyles.AdjustToUniversal come parametro per il metodo DateTime.ParseExact. Per ulteriori informazioni sull'offset UTC dei vari fusi orari, vedere GetUtcOffset.
Imports System
Imports System.Globalization
Imports System.Threading
Public Class TimeZoneSample
Public Shared Sub Main()
Dim en As New CultureInfo("en-US")
Thread.CurrentThread.CurrentCulture = en
' Creates a DateTime for the local time.
Dim dt As New DateTime(2001, 7, 13, 4, 0, 0)
' Converts the local DateTime to the UTC time.
Dim utcdt As DateTime = dt.ToUniversalTime()
' Defines a custom string format to display the DateTime.
' zzz specifies the full time zone offset.
Dim format As [String] = "MM/dd/yyyy hh:mm:sszzz"
' Converts the local time to a string
' using the custom format string and display.
Dim str As [String] = dt.ToString(format)
Console.WriteLine(str)
' Converts the UTC time to a string
' using the custom format string and display.
Dim utcstr As [String] = utcdt.ToString(format)
Console.WriteLine(utcstr)
' Converts the string back to a local DateTime and displays it.
Dim parsedBack As DateTime = DateTime.ParseExact(str, format,
en.DateTimeFormat)
Console.WriteLine(parsedBack)
' Converts the string back to a UTC DateTime and displays it.
' If you do not use the DateTime.ParseExact method that takes
' a DateTimeStyles.AdjustToUniversal value, the parsed DateTime
' will not include the time zone information.
Dim parsedBackUTC As DateTime = DateTime.ParseExact(str, format, _
en.DateTimeFormat, DateTimeStyles.AdjustToUniversal)
Console.WriteLine(parsedBackUTC)
End Sub
End Class
using System;
using System.Globalization;
using System.Threading;
public class TimeZoneSample
{
public static void Main()
{
CultureInfo en = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = en;
// Creates a DateTime for the local time.
DateTime dt = new DateTime(2001, 7, 13, 4, 0, 0);
// Converts the local DateTime to the UTC time.
DateTime utcdt = dt.ToUniversalTime();
// Defines a custom string format to display the DateTime value.
// zzzz specifies the full time zone offset.
String format = "MM/dd/yyyy hh:mm:sszzz";
// Converts the local DateTime to a string
// using the custom format string and display.
String str = dt.ToString(format);
Console.WriteLine(str);
// Converts the UTC DateTime to a string
// using the custom format string and display.
String utcstr = utcdt.ToString(format);
Console.WriteLine(utcstr);
// Converts the string back to a local DateTime and displays it.
DateTime parsedBack =
DateTime.ParseExact(str,format,en.DateTimeFormat);
Console.WriteLine(parsedBack);
// Converts the string back to a UTC DateTime and displays it.
// If you do not use the DateTime.ParseExact method that takes
// a DateTimeStyles.AdjustToUniversal value, the parsed DateTime
// object will not include the time zone information.
DateTime parsedBackUTC = DateTime.ParseExact(str,format, _
en.DateTimeFormat, DateTimeStyles.AdjustToUniversal);
Console.WriteLine(parsedBackUTC);
}
}
L'output del codice è il seguente:
07/13/2001 04:00:00-07:00
07/13/2001 11:00:00-07:00
7/13/2001 4:00:00 AM
7/13/2001 11:00:00 AM
Operazioni con i membri DateTime
Quando si utilizza la struttura DateTime, tenere presente che i membri quale DateTime.Day sono basati sul calendario gregoriano. Anche se l'applicazione cambia il calendario corrente o consente all'utente di modificare le impostazioni di data e ora mediante le opzioni internazionali e della lingua nel Pannello di controllo, il calendario gregoriano viene comunque utilizzato per eseguire i calcoli relativi ai metodi DateTime. Questa funzionalità impedisce che i calcoli eseguiti da questi metodi vengano alterati dalle impostazioni dell'utente. Per fare in modo che l'applicazione esegua operazioni su data e ora dipendenti dalle impostazioni cultura in base al calendario corrente, l'applicazione deve utilizzare la proprietà DateTimeFormatInfo.Calendar per chiamare i metodi forniti dalla classe Calendar, ad esempio Calendar.GetDayOfMonth. Per un esempio sui diversi valori recuperati dai membri DateTime e dai membri DateTimeFormatInfo.Calendar, vedere Uso di calendari per specifiche impostazioni cultura.
Nell'utilizzo della struttura DateTime, tenere presente che un tipo DateTime è un valore immutabile. Pertanto, i metodi quale DateTime.AddDays recuperano un nuovo valore DateTime anziché incrementarne uno esistente. Nell'esempio riportato di seguito viene illustrato come incrementare un tipo DateTime di un giorno utilizzando l'istruzione dt = dt.AddDays(1).
Imports System
Imports System.Globalization
Imports System.Threading
Imports Microsoft.VisualBasic
Public Class TestClass
Public Shared Sub Main()
Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
Dim dt As DateTime = DateTime.Now
Console.WriteLine(ControlChars.Newline + " Today is {0}", _
DateTime.Now.ToString("d"))
' Increments dt by one day.
dt = dt.AddDays(1)
Console.WriteLine(ControlChars.Newline + " Tomorrow is {0}", _
dt.ToString("d"))
End Sub
End Class
using System;
using System.Globalization;
using System.Threading;
public class TestClass
{
public static void Main()
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
DateTime dt = DateTime.Now;
Console.WriteLine("Today is {0}", DateTime.Now.ToString("d"));
// Increments dt by one day.
dt = dt.AddDays(1);
Console.WriteLine("Tomorrow is {0}", dt.ToString("d"));
}
}
Se si esegue questo codice in data 3 agosto 2001, l'output avrà il seguente aspetto:
Today is 8/3/2001
Tomorrow is 8/4/2001