今天發現了一個奇怪的現象:
背景
我試圖從資料庫中加載一些日期(保存為字串),我注意到由于我本地資料庫上的格式,日期時間獲取失敗,我進行了調查,我發現雖然從資料庫中保存和加載這些值的類總是使用喜歡保存的格式字串yyyy/MM/dd,但無論出于何種原因,我的資料庫上的日期都是格式yyyy-MM-dd。
我進行了更多調查,發現錯誤的值是我在測驗一些新功能時保存的值,分析更多我發現所有DateTime.ToString(formatStr)使用上述格式字串的呼叫將日期部分用“-”而不是'/' 如我所料。
問題
在這一點上,我用字面上的 4 行輸出了一個簡單的控制臺程式,在注釋中輸出。
Console.WriteLine(DateTime.Today
.ToString("yyyy/MM/dd")); // Ouputs 2022-10-24
Console.WriteLine(DateTime.Today
.ToString("yyyy/MM/dd", new CultureInfo("en-US"))); // Ouputs 2022-10-24
Console.WriteLine(DateTime.Today
.ToString("yyyy/MM/dd", CultureInfo.InvariantCulture)); // Ouputs 2022/10/24
Console.WriteLine(DateTime.Today
.ToString("yyyy/MM/dd", CultureInfo.CurrentCulture)); // Ouputs 2022-10-24
我補充說,對于我所有的同事來說,所有之前的行的結果都2022/10/24如我所料,我目前的文化是美國。
結論
我錯過了什么嗎?我認識的人似乎都無法復制這一點,但由于這個原因,我遇到了很多非常有趣的錯誤。
編輯:更正的代碼片段
uj5u.com熱心網友回復:
日期格式字串中的“/”不是文字,它具有特殊含義:
“/”自定義格式說明符表示日期分隔符,用于區分年、月和日。從當前或指定區域性的 DateTimeFormatInfo.DateSeparator 屬性中檢索適當的本地化日期分隔符。
所以它代表本地化的日期分隔符,實際使用的符號取決于當前或指定的文化。
這意味著在您的情況下CultureInfo.CurrentCulture.DateTimeFormat.DateSeparator是“-”而不是“/”。
現在在您的測驗控制臺程式中,您沒有將文化傳遞給DateTime.ToString,而是將它們傳遞給Console.WriteLine呼叫,因此它們對格式沒有影響。相反,您應該這樣做:
Console.WriteLine(DateTime.Today.ToString("yyyy/MM/dd", new CultureInfo("en-US")));
這將輸出你所期望的。
您還可以使用始終使用“/”作為分隔符的格式字串:
DateTime.Today.ToString("yyyy'/'MM'/'dd");
更新。至于為什么在你的en-US文化案例中你會看到這個分隔符。很可能在此機器上的日期格式已在 Windows 設定中手動更改。CultureInfo.CurrentCulture反映了這種變化。至于手動創建的實體CultureInfo-CultureInfo有幾個建構式,其中之一是:
public CultureInfo(string name, bool useUserOverride)
第二個引數useUserOverride定義是否反映用戶的此類更改。然后,您在示例中使用的建構式:
new CultureInfo("en-US")
true用as呼叫上面的建構式useUserOverride,所以在這種情況下它也反映了這個變化。
如果你這樣做:
Console.WriteLine(DateTime.Today
.ToString("yyyy/MM/dd", new CultureInfo("en-US", false)));
然后它不應該使用那些手動更改的設定,然后應該輸出您期望的內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/520245.html
標籤:C#细绳约会时间
