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.
In molte applicazioni, un valore di data e ora è destinato a identificare in modo univoco un singolo punto nel tempo. Questo articolo illustra come salvare e ripristinare un DateTime valore, un DateTimeOffset valore e un valore di data e ora con informazioni sul fuso orario in modo che il valore ripristinato identifichi la stessa ora del valore salvato.
Round trip di un valore DateTime
Convertire il DateTime valore nella relativa rappresentazione di stringa chiamando il DateTime.ToString(String) metodo con l'identificatore di formato "o".
Salvare la rappresentazione di stringa del DateTime valore in un file o passarla attraverso un processo, un dominio applicazione o un limite del computer.
Recuperare la stringa che rappresenta il DateTime valore.
Chiamare il DateTime.Parse(String, IFormatProvider, DateTimeStyles) metodo e passare DateTimeStyles.RoundtripKind come valore del
styles
parametro .
Nell'esempio seguente viene illustrato come eseguire una conversione di andata e ritorno di un valore DateTime.
const string fileName = @".\DateFile.txt";
StreamWriter outFile = new StreamWriter(fileName);
// Save DateTime value.
DateTime dateToSave = DateTime.SpecifyKind(new DateTime(2008, 6, 12, 18, 45, 15),
DateTimeKind.Local);
string? dateString = dateToSave.ToString("o");
Console.WriteLine($"Converted {dateToSave.ToString()} ({dateToSave.Kind.ToString()}) to {dateString}.");
outFile.WriteLine(dateString);
Console.WriteLine($"Wrote {dateString} to {fileName}.");
outFile.Close();
// Restore DateTime value.
DateTime restoredDate;
using StreamReader inFile = new StreamReader(fileName);
dateString = inFile.ReadLine();
if (dateString is not null)
{
restoredDate = DateTime.Parse(dateString, null, DateTimeStyles.RoundtripKind);
Console.WriteLine($"Read {restoredDate.ToString()} ({restoredDate.Kind.ToString()}) from {fileName}.");
}
// The example displays the following output:
// Converted 6/12/2008 6:45:15 PM (Local) to 2008-06-12T18:45:15.0000000-05:00.
// Wrote 2008-06-12T18:45:15.0000000-05:00 to .\DateFile.txt.
// Read 6/12/2008 6:45:15 PM (Local) from .\DateFile.txt.
Const fileName As String = ".\DateFile.txt"
Dim outFile As New StreamWriter(fileName)
' Save DateTime value.
Dim dateToSave As Date = DateTime.SpecifyKind(#06/12/2008 6:45:15 PM#, _
DateTimeKind.Local)
Dim dateString As String = dateToSave.ToString("o")
Console.WriteLine("Converted {0} ({1}) to {2}.", dateToSave.ToString(), _
dateToSave.Kind.ToString(), dateString)
outFile.WriteLine(dateString)
Console.WriteLine("Wrote {0} to {1}.", dateString, fileName)
outFile.Close()
' Restore DateTime value.
Dim restoredDate As Date
Dim inFile As New StreamReader(fileName)
dateString = inFile.ReadLine()
inFile.Close()
restoredDate = DateTime.Parse(dateString, Nothing, DateTimeStyles.RoundTripKind)
Console.WriteLine("Read {0} ({2}) from {1}.", restoredDate.ToString(), _
fileName, restoredDAte.Kind.ToString())
' The example displays the following output:
' Converted 6/12/2008 6:45:15 PM (Local) to 2008-06-12T18:45:15.0000000-05:00.
' Wrote 2008-06-12T18:45:15.0000000-05:00 to .\DateFile.txt.
' Read 6/12/2008 6:45:15 PM (Local) from .\DateFile.txt.
Quando si effettua una conversione di andata e ritorno di un valore DateTime, questa tecnica riesce a mantenere correttamente l'ora per tutti i tempi locali e universali. Ad esempio, se un valore locale DateTime viene salvato in un sistema nel fuso orario standard del Pacifico degli Stati Uniti e viene ripristinato in un sistema nel fuso orario standard degli Stati Uniti centrali, la data e l'ora ripristinate saranno due ore dopo l'ora originale, che riflette la differenza di tempo tra i due fusi orari. Tuttavia, questa tecnica non è necessariamente accurata per i tempi non specificati. Tutti i DateTime valori la cui Kind proprietà è Unspecified sono considerati come orari locali. Se non si tratta di un'ora locale, l'oggetto DateTime non riesce a identificare il punto nel tempo in modo corretto. La soluzione alternativa per questa limitazione consiste nell'accoppiare strettamente un valore di data e ora con il relativo fuso orario per l'operazione di salvataggio e ripristino.
Conversione andata e ritorno di un valore DateTimeOffset
Convertire il DateTimeOffset valore nella relativa rappresentazione di stringa chiamando il DateTimeOffset.ToString(String) metodo con l'identificatore di formato "o".
Salvare la rappresentazione della stringa del valore DateTimeOffset in un file o passarla attraverso un processo, un dominio applicativo o un confine della macchina.
Recuperare la stringa che rappresenta il DateTimeOffset valore.
Chiamare il DateTimeOffset.Parse(String, IFormatProvider, DateTimeStyles) metodo e passare DateTimeStyles.RoundtripKind come valore del
styles
parametro .
Nell'esempio seguente viene illustrato come eseguire il round trip di un DateTimeOffset valore.
const string fileName = @".\DateOff.txt";
StreamWriter outFile = new StreamWriter(fileName);
// Save DateTime value.
DateTimeOffset dateToSave = new DateTimeOffset(2008, 6, 12, 18, 45, 15,
new TimeSpan(7, 0, 0));
string? dateString = dateToSave.ToString("o");
Console.WriteLine($"Converted {dateToSave.ToString()} to {dateString}.");
outFile.WriteLine(dateString);
Console.WriteLine($"Wrote {dateString} to {fileName}.");
outFile.Close();
// Restore DateTime value.
DateTimeOffset restoredDateOff;
using StreamReader inFile = new StreamReader(fileName);
dateString = inFile.ReadLine();
if (dateString is not null)
{
restoredDateOff = DateTimeOffset.Parse(dateString, null,
DateTimeStyles.RoundtripKind);
Console.WriteLine($"Read {restoredDateOff.ToString()} from {fileName}.");
}
// The example displays the following output:
// Converted 6/12/2008 6:45:15 PM +07:00 to 2008-06-12T18:45:15.0000000+07:00.
// Wrote 2008-06-12T18:45:15.0000000+07:00 to .\DateOff.txt.
// Read 6/12/2008 6:45:15 PM +07:00 from .\DateOff.txt.
Const fileName As String = ".\DateOff.txt"
Dim outFile As New StreamWriter(fileName)
' Save DateTime value.
Dim dateToSave As New DateTimeOffset(2008, 6, 12, 18, 45, 15, _
New TimeSpan(7, 0, 0))
Dim dateString As String = dateToSave.ToString("o")
Console.WriteLine("Converted {0} to {1}.", dateToSave.ToString(), dateString)
outFile.WriteLine(dateString)
Console.WriteLine("Wrote {0} to {1}.", dateString, fileName)
outFile.Close()
' Restore DateTime value.
Dim restoredDateOff As DateTimeOffset
Dim inFile As New StreamReader(fileName)
dateString = inFile.ReadLine()
inFile.Close()
restoredDateOff = DateTimeOffset.Parse(dateString, Nothing, DateTimeStyles.RoundTripKind)
Console.WriteLine("Read {0} from {1}.", restoredDateOff.ToString(), fileName)
' The example displays the following output:
' Converted 6/12/2008 6:45:15 PM +07:00 to 2008-06-12T18:45:15.0000000+07:00.
' Wrote 2008-06-12T18:45:15.0000000+07:00 to .\DateOff.txt.
' Read 6/12/2008 6:45:15 PM +07:00 from .\DateOff.txt.
Questa tecnica identifica sempre in modo univoco un DateTimeOffset valore come un singolo punto nel tempo. Il valore può quindi essere convertito in utc (Coordinated Universal Time) chiamando il DateTimeOffset.ToUniversalTime metodo oppure può essere convertito nell'ora in un determinato fuso orario chiamando il DateTimeOffset.ToOffset metodo o TimeZoneInfo.ConvertTime(DateTimeOffset, TimeZoneInfo) . La limitazione principale di questa tecnica è che l'aritmetica di data e ora, se eseguita su un DateTimeOffset valore che rappresenta l'ora in un particolare fuso orario, potrebbe non produrre risultati accurati per il fuso orario. Questo perché quando viene creata un'istanza di un DateTimeOffset valore, viene disassociato dal relativo fuso orario. Pertanto, le regole di regolazione del fuso orario non possono più essere applicate quando si eseguono calcoli di data e ora. È possibile risolvere questo problema definendo un tipo personalizzato che include sia un valore di data che ora e il relativo fuso orario adiacente.
Compilare il codice
Questi esempi richiedono che gli spazi dei nomi seguenti vengano importati con direttive C# using
o istruzioni Visual Basic Imports
:
- System (solo C#)
- System.Globalization
- System.IO