我有關于DateTimeKindC# 結構的問題。
如果我已使用以下內容DateTime將 a轉換為新的 DateTime(不在我的本地時區中):
TimeZoneInfo.ConvertTimeBySystemTimeZoneId(now, "Tokyo Standard Time");
我應該Kind為那個新的 DateTime的屬性使用什么?Unspecified感覺有點奇怪,對轉換沒有太大幫助。
我的感覺是,一旦您使用了一個Timezone不是您本地的也不是 UTC 的,那么您絕對必須開始使用該DateTimeOffset結構。
uj5u.com熱心網友回復:
我應該為那個新 DateTime 的 Kind 屬性使用什么?
Unspecified感覺有點奇怪……
...但在這種情況下它是正確的值。DateTimeKind 列舉的檔案在這個主題上非常清楚:
Local (2):表示的時間為當地時間。
未指定(0):表示的時間未指定為本地時間或協調世界時 (UTC)。
Utc (1):表示的時間是UTC。
您的時間既不是本地時間也不是 UTC,因此唯一正確的值是Unspecified.
我的感覺是,一旦您使用的時區不是您的本地時區,也不是 UTC,那么您絕對必須開始使用該
DateTimeOffset結構。
您不必這樣做,但它絕對可以讓您的生活更輕松。正如您所注意到的,DateTime沒有提供將時區資訊與日期一起存盤的選項。這正是DateTimeOffset它的目的。
uj5u.com熱心網友回復:
這更多是關于如何處理非本地時區的問題。
當您超出本地時區時,您確實需要使用DateTimeOffset該類。
在撰寫時間服務時,您可能希望添加一種將一個非本地時區中的 DateTime 轉換為另一個非本地時區的方法。使用DateTimeOffset該類時,這非常簡單:
public DateTimeOffset ConvertToZonedOffset(DateTimeOffset toConvert, string timeZoneId)
{
var universalTime = toConvert.ToUniversalTime(); // first bring it back to the common baseline (or standard)
var dateTimeOffset = TimeZoneInfo.ConvertTime(universalTime, TimeZoneInfo.FindSystemTimeZoneById(timeZoneId));
return dateTimeOffset;
}
傳入DateTimeOffset具有源偏移量,timeZoneId傳入提供足夠的資訊來實作目標時區(和偏移量)。
并且回傳的DateTimeOffset具有目標偏移量。
DateTime如果你想提供一個等效的方法,當你使用結構體時,它會變得有點笨拙:
public DateTime ConvertToZonedOffset(DateTime toConvert, string sourceTimeZoneId, string targetTimeZoneId)
{
return TimeZoneInfo.ConvertTimeBySystemTimeZoneId(toConvert, sourceTimeZoneId, targetTimeZoneId);
}
這就是它的DateTimeKind用武之地。如果您:
- 傳遞 DateTime 并將 Kind 設定為 UTC 或 Local;和
- sourceTimeZone 兩者都不是,
然后ConvertTimeBySystemTimeZoneId會拋出例外。因此,當您處理“第三時區”時, Kind 必須是Unspecified. 這告訴方法忽略系統時鐘,不要假設它是 UTC 并按照作為 sourceTimeZone 傳入的任何內容進行處理。
它DateTimeOffset在另一個方面不如版本。回傳的DateTime沒有關于時區的資訊,并且Kind設定為Unspecified。這基本上意味著呼叫代碼有責任知道和跟蹤該日期和時間在哪個時區有效。不理想。以至于我決定“自以為是”并擺脫這種方法。我將強制呼叫代碼將DateTime它們可能正在使用的轉換為 aDateTimeOffset并在回傳時使用一個。
注意 1:如果Kind設定為Local并且 sourceTimeZone 與您的本地時區匹配,它將正常作業。
注 2:如果Kind設定為Utc并且 sourceTimeZone 設定為“協調世界時”,您可能會得到以下資訊TimeZoneNotFoundException:
在本地計算機上找不到時區 ID 'Coordinated Universal Time'
我認為這是因為 UTC 是標準而不是時區,盡管TimeZoneInfo.GetSystemTimeZones作為Timezone.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/394485.html
