操作說明:反覆存取日期與時間值
在許多應用程式中,日期和時間值的用途都是要明確地識別單一時間點。 本文顯示如何儲存並還原 DateTime 值、DateTimeOffset 值,以及具有時區資訊的日期與時間值,讓還原值能夠識別出與儲存值相同的時間。
反覆存取 DateTime 值
搭配 "o" 格式規範呼叫 DateTime.ToString(String) 方法,以將 DateTime 值轉換為其字串表示。
將 DateTime 值的字串表示儲存至檔案,或跨處理序、應用程式定義域或電腦界限進行傳遞。
擷取代表 DateTime 值的字串。
呼叫 DateTime.Parse(String, IFormatProvider, DateTimeStyles) 方法,然後傳遞 DateTimeStyles.RoundtripKind 作為
styles
參數值。
下列範例說明如何反覆存取 DateTime 值。
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.
反覆存取 DateTime 值時,這項技術可以成功保留所有當地和全球通用時間的時間。 例如,如果本地 DateTime 值是儲存在美國太平洋標準時間時區系統中,並且還原為美國中央標準時間時區系統中,則還原的日期和時間會比原始時間多兩小時,反映出兩個時區之間的時差。 不過,針對未指定的時間,這項技術並不一定準確。 所有 Kind 屬性為 Unspecified 的 DateTime 值,都會被視為當地時間。 若不是本地時間,則 DateTime 不會成功識別正確的時間點。 這項限制的因應措施,是將日期和時間值與其儲存和還原作業的時區緊密結合。
反覆存取 DateTimeOffset 值
搭配 "o" 格式規範呼叫 DateTimeOffset.ToString(String) 方法,以將 DateTimeOffset 值轉換為其字串表示。
將 DateTimeOffset 值的字串表示儲存至檔案,或跨處理序、應用程式定義域或電腦界限進行傳遞。
擷取代表 DateTimeOffset 值的字串。
呼叫 DateTimeOffset.Parse(String, IFormatProvider, DateTimeStyles) 方法,然後傳遞 DateTimeStyles.RoundtripKind 作為
styles
參數值。
下列範例說明如何反覆存取 DateTimeOffset 值。
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.
這項技術一律會明確地將 DateTimeOffset 值識別為單一時間點。 接著可呼叫 DateTimeOffset.ToUniversalTime 方法來將值轉換為國際標準時間 (UTC),或者可以呼叫 DateTimeOffset.ToOffset 或 TimeZoneInfo.ConvertTime(DateTimeOffset, TimeZoneInfo) 方法來將它轉換為特定時區的時間。 這項技術有個主要限制:在表示特定時區之時間的 DateTimeOffset 值上執行日期和時間算術時,可能不會產生該時區的精確結果。 這是因為在將 DateTimeOffset 值具現化時,就會解除它與其時區的關聯。 因此,當您執行日期和時間計算時,就無法再套用該時區的調整規則。 若要解決這個問題,您可以定義自訂類型,以包含日期與時間值及其隨附的時區。
編譯程式碼
這些範例需要以 C# using
指示詞或 Visual Basic Imports
陳述式匯入下列命名空間:
- System (僅限 C#)
- System.Globalization
- System.IO