Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En muchas aplicaciones, un valor de fecha y hora está pensado para identificar de forma inequívoca un único punto en el tiempo. En este artículo se muestra cómo guardar y restaurar un DateTime valor, un DateTimeOffset valor y un valor de fecha y hora con información de zona horaria para que el valor restaurado identifique la misma hora que el valor guardado.
Ida y vuelta de un valor DateTime
Convierta el valor DateTime en su representación de cadena llamando al método DateTime.ToString(String) con el especificador de formato "o".
Guarde la representación de cadena del DateTime valor en un archivo o pásela a través de un proceso, dominio de aplicación o límite de máquina.
Recupere la cadena que representa el DateTime valor.
Llame al DateTime.Parse(String, IFormatProvider, DateTimeStyles) método y pase DateTimeStyles.RoundtripKind como valor del
stylesparámetro .
En el ejemplo siguiente se muestra cómo realizar un recorrido de ida y vuelta de un DateTime valor.
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.
Al recorrer de ida y vuelta un DateTime valor, esta técnica conserva correctamente el tiempo de todas las horas locales y universales. Por ejemplo, si se guarda un valor local DateTime en un sistema en la zona horaria estándar del Pacífico de EE. UU. y se restaura en un sistema de la zona horaria estándar del Centro de EE. UU., la fecha y hora restauradas serán dos horas más tarde que la hora original, lo que refleja la diferencia de huso horario entre ambas zonas. Sin embargo, esta técnica no es necesariamente precisa para los tiempos no especificados. Todos los valores DateTime cuya propiedad Kind es Unspecified se tratan como si fueran horarios locales. Si no es una hora local, el DateTime no logra identificar correctamente el punto correcto en el tiempo. La solución alternativa para esta limitación es acoplar estrechamente un valor de fecha y hora con su zona horaria para la operación de guardado y restauración.
Procesar un valor DateTimeOffset de ida y vuelta
Convierta el DateTimeOffset valor en su representación de cadena llamando al DateTimeOffset.ToString(String) método con el especificador de formato "o".
Guarde la representación de cadena del DateTimeOffset valor en un archivo o pásela a través de un proceso, dominio de aplicación o límite de máquina.
Recupere la cadena que representa el DateTimeOffset valor.
Llame al DateTimeOffset.Parse(String, IFormatProvider, DateTimeStyles) método y pase DateTimeStyles.RoundtripKind como valor del
stylesparámetro .
En el ejemplo siguiente se muestra cómo realizar un recorrido de ida y vuelta de un DateTimeOffset valor.
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.
Esta técnica siempre identifica de forma inequívoca un DateTimeOffset valor como un único punto en el tiempo. A continuación, el valor se puede convertir en hora universal coordinada (UTC) llamando al DateTimeOffset.ToUniversalTime método o se puede convertir a la hora en una zona horaria determinada llamando al DateTimeOffset.ToOffset método o TimeZoneInfo.ConvertTime(DateTimeOffset, TimeZoneInfo) . La limitación principal de esta técnica es que la aritmética de fecha y hora, cuando se realiza en un DateTimeOffset valor que representa la hora en una zona horaria determinada, puede no generar resultados precisos para esa zona horaria. Esto se debe a que, cuando se crea una instancia de un valor DateTimeOffset, se desasocia de su zona horaria. Por lo tanto, las reglas de ajuste de esa zona horaria ya no se pueden aplicar al realizar cálculos de fecha y hora. Puede solucionar este problema definiendo un tipo personalizado que incluya un valor de fecha y hora y su zona horaria adjunta.
Compilación del código
Estos ejemplos requieren que se importen los siguientes espacios de nombres con directivas de C# using o instrucciones de Visual Basic Imports :
- System (Solo C#)
- System.Globalization
- System.IO