Postupy: Hodnoty data a času odezvy

V mnoha aplikacích je hodnota data a času určená k jednoznačné identifikaci jednoho bodu v čase. Tento článek ukazuje, jak uložit a obnovit DateTime hodnotu, DateTimeOffset hodnotu a hodnotu data a času s informacemi o časovém pásmu, aby obnovená hodnota identifikovala stejný čas jako uložená hodnota.

Doba odezvy a hodnota DateTime

  1. DateTime Převeďte hodnotu na řetězcovou reprezentaci voláním DateTime.ToString(String) metody se specifikátorem formátu "o".

  2. Uložte řetězcovou DateTime reprezentaci hodnoty do souboru nebo ji předejte přes proces, doménu aplikace nebo hranici počítače.

  3. Načtěte řetězec, který představuje DateTime hodnotu.

  4. Zavolejte metodu DateTime.Parse(String, IFormatProvider, DateTimeStyles) a předejte DateTimeStyles.RoundtripKind jako hodnotu parametru styles .

Následující příklad ukazuje, jak zaokrouhlit DateTime hodnotu.

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 {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.
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 {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.
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.

Při zaokrouhlování DateTime hodnoty tato technika úspěšně zachová čas pro všechny místní a univerzální časy. Pokud je například místní DateTime hodnota uložena v systému v americkém standardním časovém pásmu Tichomoří a obnoví se v systému v americkém standardním časovém pásmu, obnovené datum a čas bude o dvě hodiny pozdější než původní čas, což odráží časový rozdíl mezi dvěma časovými pásmy. Tato technika však nemusí být nutně přesná pro nespecifikované časy. Všechny DateTime hodnoty, jejichž Kind vlastnost je Unspecified považována za místní časy. Pokud se nejedná o místní čas, DateTime nebude správně identifikovat správný bod v čase. Alternativním řešením tohoto omezení je úzce spojit hodnotu data a času s časovým pásmem pro operaci uložení a obnovení.

Zpáteční cesta a hodnota DateTimeOffset

  1. DateTimeOffset Převeďte hodnotu na řetězcovou reprezentaci voláním DateTimeOffset.ToString(String) metody se specifikátorem formátu "o".

  2. Uložte řetězcovou DateTimeOffset reprezentaci hodnoty do souboru nebo ji předejte přes proces, doménu aplikace nebo hranici počítače.

  3. Načtěte řetězec, který představuje DateTimeOffset hodnotu.

  4. Zavolejte metodu DateTimeOffset.Parse(String, IFormatProvider, DateTimeStyles) a předejte DateTimeStyles.RoundtripKind jako hodnotu parametru styles .

Následující příklad ukazuje, jak zaokrouhlit DateTimeOffset hodnotu.

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 {0} to {1}.", dateToSave.ToString(),
                  dateString);
outFile.WriteLine(dateString);
Console.WriteLine("Wrote {0} to {1}.", dateString, 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 {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.
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.

Tato technika vždy jednoznačně identifikuje DateTimeOffset hodnotu jako jeden bod v čase. Hodnotu pak lze převést na koordinovaný univerzální čas (UTC) voláním DateTimeOffset.ToUniversalTime metody, nebo ji lze převést na čas v určitém časovém pásmu voláním DateTimeOffset.ToOffset nebo TimeZoneInfo.ConvertTime(DateTimeOffset, TimeZoneInfo) metodou. Hlavním omezením této techniky je, že aritmetika data a času při provedení s DateTimeOffset hodnotou, která představuje čas v určitém časovém pásmu, nemusí pro toto časové pásmo produkovat přesné výsledky. Důvodem je to, že když DateTimeOffset se vytvoří instance hodnoty, oddělí se od časového pásma. Pravidla úprav časového pásma proto již nelze použít při provádění výpočtů data a času. Tento problém můžete vyřešit definováním vlastního typu, který zahrnuje hodnotu data i času a jeho doprovodné časové pásmo.

Kompilace kódu

Tyto příklady vyžadují import následujících oborů názvů s direktivami jazyka C# using nebo příkazy jazyka Visual Basic Imports :

Viz také