簡體   English   中英

從字符串創建日期時間而不應用時區或夏令時

[英]Create DateTime from string without applying timezone or daylight savings

如何從已針對 UTC 調整的字符串創建日期時間變量? 我在設置為 BST (GMT+1) 的機器上運行它。 如果我運行以下代碼行:

DateTime clientsideProfileSyncStamp = Convert.ToDateTime("20-May-2011 15:20:00");

然后在針對數據庫保存 (UTC) 值的測試中使用該值,然后看起來 Convert.ToDateTime() 實際上給我 14:20 的 UTC 值。 我不希望它進行轉換 - 我只是希望它接受我的 DateTime 字符串已經在 UTC 中。

謝謝。

解析字符串,並指定在字符串中未指定時區的情況下采用UTC時間:

DateTime clientsideProfileSyncStamp =
  DateTime.Parse(
    "20-May-2011 15:20:00",
    CultureInfo.CurrentCulture,
    DateTimeStyles.AssumeUniversal
  );

使用

DateTimeOffset.Parse

投放不足的DateTimeOffset類型表示一個時間點,而不考慮時區差異,因此應優先使用需要“時間戳”的DateTime。

@Guffa的答案很好,但我想補充一個答案。 如果您的日期時間字符串看起來像這樣的“ 2017-11-27T05:30:00.000Z”,則AssumeUniversal無法正常工作。 嘗試這個 :

    DateTime.Parse("2017-11-27T05:30:00.000Z", null, System.Globalization.DateTimeStyles.AdjustToUniversal);

AssumeUniversal和AdjustToUniversal之間略有不同。 在這里閱讀: AssumeUniversal和AdjustToUniversal之間的區別

在DateTime字符串中添加一個Z

DateTime clientsideProfileSyncStamp = Convert.ToDateTime("20-May-2011 15:20:00Z");
Console.Write(clientsideProfileSyncStamp.ToUniversalTime()); // 20-May-2011 15:20:00

不要忘記TryParse變體,它使您可以毫無例外地處理解析錯誤

DateTime clientsideProfileSyncStamp;
DateTime.TryParse(
    "20-May-2011 15:20:00",
    System.Globalization.CultureInfo.CurrentCulture,
    System.Globalization.DateTimeStyles.AssumeUniversal,
    out clientsideProfileSyncStamp
);

另外,如果您未使用ParseExactTryParseExact ,它將假定輸出KindLocal因此您可能還想使用ToUniversalTime()

clientsideProfileSyncStamp.ToUniversalTime();

DateTime.Parse()DateTime.TryParse()

var clientsideProfileSyncStamp = DateTime.Parse("20-May-2011 15:20:00");

要創建與文化無關的日期時間,請使用:

DateTime.Parse("2022-02-15 09:30:47", CultureInfo.InvariantCulture)

然后日期始終與字符串中定義的完全一致。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM