Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In vielen Anwendungen soll ein Datums- und Uhrzeitwert eindeutig einen einzelnen Zeitpunkt identifizieren. In diesem Artikel wird gezeigt, wie Sie einen DateTime Wert, einen DateTimeOffset Wert und einen Datums- und Uhrzeitwert mit Zeitzoneninformationen speichern und wiederherstellen, damit der wiederhergestellte Wert dieselbe Zeit wie der gespeicherte Wert identifiziert.
Rundlauf für einen DateTime-Wert
Konvertieren Sie den DateTime Wert in die Zeichenfolgendarstellung, indem Sie die DateTime.ToString(String) Methode mit dem Formatbezeichner "o" aufrufen.
Speichern Sie die Zeichenfolgendarstellung des DateTime Werts in einer Datei, oder übergeben Sie ihn über eine Prozess-, Anwendungsdomäne oder Computergrenze.
Rufen Sie die Zeichenfolge ab, die den DateTime Wert darstellt.
Rufen Sie die DateTime.Parse(String, IFormatProvider, DateTimeStyles) Methode auf, und übergeben Sie sie DateTimeStyles.RoundtripKind als Wert des
stylesParameters.
Im folgenden Beispiel wird veranschaulicht, wie ein DateTime Wert gerundet wird.
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.
Beim Roundtripping eines DateTime Werts behält diese Technik die Zeit für alle lokalen und universellen Zeiten erfolgreich bei. Wenn z. B. ein lokaler DateTime Wert in einem System in der Us-Pazifischen Standardzeitzone gespeichert und auf einem System in der Us-Zentralstandardzeitzone wiederhergestellt wird, liegt das wiederhergestellte Datum und die Uhrzeit zwei Stunden später als die ursprüngliche Uhrzeit, was den Zeitunterschied zwischen den beiden Zeitzonen widerspiegelt. Diese Technik ist jedoch nicht unbedingt für nicht angegebene Zeiten korrekt. Alle DateTime Werte, deren Kind Eigenschaft Unspecified ist, werden als lokale Zeiten behandelt. Wenn es sich nicht um eine Ortszeit handelt, wird der DateTime richtige Zeitpunkt nicht erfolgreich identifiziert. Die Problemumgehung für diese Einschränkung besteht darin, einen Datums- und Uhrzeitwert eng mit seiner Zeitzone für den Speicher- und Wiederherstellungsvorgang zu koppeln.
Roundtrip für einen DateTimeOffset-Wert
Konvertieren Sie den DateTimeOffset Wert in die Zeichenfolgendarstellung, indem Sie die DateTimeOffset.ToString(String) Methode mit dem Formatbezeichner "o" aufrufen.
Speichern Sie die Zeichenfolgendarstellung des DateTimeOffset Werts in einer Datei, oder übergeben Sie ihn über eine Prozess-, Anwendungsdomäne oder Computergrenze.
Rufen Sie die Zeichenfolge ab, die den DateTimeOffset Wert darstellt.
Rufen Sie die DateTimeOffset.Parse(String, IFormatProvider, DateTimeStyles) Methode auf, und übergeben Sie sie DateTimeStyles.RoundtripKind als Wert des
stylesParameters.
Im folgenden Beispiel wird veranschaulicht, wie ein DateTimeOffset Wert hin- und zurückkonvertiert wird.
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.
Diese Technik identifiziert DateTimeOffset einen Wert immer eindeutig als einzelnen Zeitpunkt. Der Wert kann dann durch Aufrufen der DateTimeOffset.ToUniversalTime Methode in koordinierte Weltzeit (Coordinated Universal Time, UTC) konvertiert werden, oder er kann durch Aufrufen der DateTimeOffset.ToOffset Methode TimeZoneInfo.ConvertTime(DateTimeOffset, TimeZoneInfo) in die Uhrzeit in eine bestimmte Zeitzone konvertiert werden. Die haupteinschränkung dieser Technik ist, dass Datums- und Uhrzeitarithmetik, wenn sie für einen DateTimeOffset Wert ausgeführt wird, der die Uhrzeit in einer bestimmten Zeitzone darstellt, möglicherweise keine genauen Ergebnisse für diese Zeitzone erzeugen. Wenn ein DateTimeOffset Wert instanziiert wird, wird er von seiner Zeitzone getrennt. Daher können die Anpassungsregeln dieser Zeitzone nicht mehr angewendet werden, wenn Sie Datums- und Uhrzeitberechnungen durchführen. Sie können dieses Problem umgehen, indem Sie einen benutzerdefinierten Typ definieren, der sowohl einen Datums- als auch einen Uhrzeitwert und die zugehörige Zeitzone enthält.
Kompilieren des Codes
In diesen Beispielen müssen die folgenden Namespaces mit C#-Direktiven oder Visual Basic-Imports-Anweisungen importiert werden.
- System (nur C#)
- System.Globalization
- System.IO