Nasıl yapılır: Gidiş dönüş Tarih ve saat değerleri

Birçok uygulamada tarih ve saat değeri, zaman içinde tek bir noktayı kesin olarak tanımlamaya yöneliktir. Bu makalede, geri yüklenen değerin kaydedilen değerle aynı zamanı tanımlaması için saat dilimi bilgileriyle bir değerin, DateTimeOffset değerin ve tarih ve saat değerinin nasıl kaydedilip geri yükleneceği DateTime gösterilmektedir.

DateTime değerine gidiş dönüş

  1. DateTime yöntemini "o" biçim tanımlayıcısıyla çağırarak DateTime.ToString(String) değeri dize gösterimine dönüştürün.

  2. Değerin dize gösterimini DateTime bir dosyaya kaydedin veya bir işlem, uygulama etki alanı veya makine sınırı boyunca geçirin.

  3. Değeri temsil eden dizeyi DateTime alın.

  4. yöntemini çağırın DateTime.Parse(String, IFormatProvider, DateTimeStyles) ve parametresinin styles değeri olarak geçirinDateTimeStyles.RoundtripKind.

Aşağıdaki örnek, bir DateTime değerin nasıl gidiş dönüş yapılacağını gösterir.

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.

Bir değeri yuvarlarken DateTime , bu teknik tüm yerel ve evrensel saatlerin süresini başarıyla korur. Örneğin, yerel DateTime bir değer ABD Pasifik Standart Saat dilimindeki bir sisteme kaydedilirse ve ABD Orta Standart Saat dilimindeki bir sisteme geri yüklenirse, geri yüklenen tarih ve saat, iki saat dilimi arasındaki saat farkını yansıtan özgün saatten iki saat sonra olur. Ancak, bu teknik belirtilmeyen zamanlar için mutlaka doğru değildir. Özelliği Unspecified yerel saatlermiş gibi ele alınan tüm DateTime değerlerKind. Yerel bir saat değilse, DateTime doğru zaman noktasını başarıyla tanımlamaz. Bu sınırlamanın geçici çözümü, kaydetme ve geri yükleme işlemi için bir tarih ve saat değerini saat dilimiyle sıkı bir şekilde bir arada kullanmaktır.

DateTimeOffset değerine gidiş dönüş

  1. DateTimeOffset yöntemini "o" biçim tanımlayıcısıyla çağırarak DateTimeOffset.ToString(String) değeri dize gösterimine dönüştürün.

  2. Değerin dize gösterimini DateTimeOffset bir dosyaya kaydedin veya bir işlem, uygulama etki alanı veya makine sınırı boyunca geçirin.

  3. Değeri temsil eden dizeyi DateTimeOffset alın.

  4. yöntemini çağırın DateTimeOffset.Parse(String, IFormatProvider, DateTimeStyles) ve parametresinin styles değeri olarak geçirinDateTimeStyles.RoundtripKind.

Aşağıdaki örnek, bir DateTimeOffset değerin nasıl gidiş dönüş yapılacağını gösterir.

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.

Bu teknik her zaman bir DateTimeOffset değeri zaman içinde tek bir nokta olarak kesin olarak tanımlar. Değer daha sonra yöntemi çağrılarak DateTimeOffset.ToUniversalTime Eşgüdümlü Evrensel Saat'e (UTC) dönüştürülebilir veya veya TimeZoneInfo.ConvertTime(DateTimeOffset, TimeZoneInfo) yöntemi çağrılarak DateTimeOffset.ToOffset belirli bir saat dilimindeki saate dönüştürülebilir. Bu tekniğin en önemli sınırlaması, belirli bir saat dilimindeki saati temsil eden bir DateTimeOffset değer üzerinde gerçekleştirildiğinde tarih ve saat aritmetiğinin bu saat dilimi için doğru sonuçlar üretememesidir. Bunun nedeni, bir DateTimeOffset değerin örneğini oluşturduğunda saat dilimiyle ilişkilendirilmemiş olmasıdır. Bu nedenle, tarih ve saat hesaplamaları yaptığınızda bu saat diliminin ayarlama kuralları artık uygulanamıyor. Hem tarih ve saat değerini hem de buna eşlik eden saat dilimini içeren özel bir tür tanımlayarak bu soruna geçici bir çözüm bulabilirsiniz.

Kodu derleme

Bu örnekler, aşağıdaki ad alanlarının C# using yönergeleri veya Visual Basic Imports deyimleriyle içeri aktarılmasını gerektirir:

Ayrıca bkz.