Cara: Nilai Tanggal dan waktu pulang-pergi

Dalam banyak aplikasi, nilai tanggal dan waktu dimaksudkan untuk mengidentifikasi secara tidak ambigu satu titik waktu. Artikel ini memperlihatkan cara menyimpan dan memulihkan DateTime nilai, DateTimeOffset nilai, dan nilai tanggal dan waktu dengan informasi zona waktu sehingga nilai yang dipulihkan mengidentifikasi waktu yang sama dengan nilai yang disimpan.

Round-trip Nilai Tanggalwaktu

  1. Konversikan DateTime nilai ke representasi stringnya dengan memanggil DateTime.ToString(String) metode dengan penentu format "o".

  2. Simpan representasi DateTime string nilai ke file, atau teruskan di seluruh proses, domain aplikasi, atau batas komputer.

  3. Ambil string yang mewakili DateTime nilai.

  4. Panggil DateTime.Parse(String, IFormatProvider, DateTimeStyles) metode, dan teruskan DateTimeStyles.RoundtripKind sebagai nilai styles parameter.

Contoh berikut mengilustrasikan cara melakukan round-trip DateTime nilai.

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.

Ketika melakukan round-tripping DateTime nilai, teknik ini berhasil mempertahankan waktu untuk semua waktu lokal dan universal. Misalnya, jika nilai lokal DateTime disimpan pada sistem di zona Waktu Standar Pasifik AS dan dipulihkan pada sistem di zona Waktu Standar Pusat AS, tanggal dan waktu yang dipulihkan akan menjadi dua jam lebih lambat dari waktu asli, yang mencerminkan perbedaan waktu antara dua zona waktu. Namun, teknik ini belum tentu akurat untuk waktu yang tidak ditentukan. Semua DateTime nilai yang propertinya Kind diperlakukan seolah-olah Unspecified itu adalah waktu lokal. Jika bukan waktu setempat, DateTime tidak berhasil mengidentifikasi titik waktu yang benar. Solusi untuk batasan ini adalah dengan menggabungkan nilai tanggal dan waktu dengan zona waktunya dengan ketat untuk operasi simpan dan pulihkan.

Round-trip nilai DateTimeOffset

  1. Konversikan DateTimeOffset nilai ke representasi stringnya dengan memanggil DateTimeOffset.ToString(String) metode dengan penentu format "o".

  2. Simpan representasi DateTimeOffset string nilai ke file, atau teruskan di seluruh proses, domain aplikasi, atau batas komputer.

  3. Ambil string yang mewakili DateTimeOffset nilai.

  4. Panggil DateTimeOffset.Parse(String, IFormatProvider, DateTimeStyles) metode, dan teruskan DateTimeStyles.RoundtripKind sebagai nilai styles parameter.

Contoh berikut mengilustrasikan cara melakukan round-trip DateTimeOffset nilai.

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.

Teknik ini selalu mengidentifikasi secara tidak ambiguDateTimeOffset nilai sebagai satu titik waktu. Nilai kemudian dapat dikonversi ke Waktu Universal Terkoordinasi (UTC) dengan memanggil DateTimeOffset.ToUniversalTime metode, atau dapat dikonversi ke waktu di zona waktu tertentu dengan memanggil DateTimeOffset.ToOffset metode atau TimeZoneInfo.ConvertTime(DateTimeOffset, TimeZoneInfo). Batasan utama dari teknik ini adalah bahwa aritmatika tanggal dan waktu, ketika dilakukan pada DateTimeOffset nilai yang mewakili waktu di zona waktu tertentu, mungkin tidak menghasilkan hasil yang akurat untuk zona waktu tersebut. Ini karena ketika DateTimeOffset nilai diinstansiasi, nilai tersebut dikaitkan dengan zona waktunya. Oleh karena itu, aturan penyesuaian zona waktu tersebut tidak dapat lagi diterapkan saat Anda melakukan perhitungan tanggal dan waktu. Anda dapat mengatasi masalah ini dengan menentukan jenis kustom yang menyertakan nilai tanggal dan waktu serta zona waktu yang menyertainya.

Mengkompilasi kode

Contoh-contoh ini mengharuskan namespace berikut diimpor dengan direktif C# using atau pernyataan Visual Basic Imports :

Lihat juga