2008-11-25 56 views
16

不確定這裏發生了什麼。String.Format(格式,日期)忽略格式

我有一個DateTime對象,當我嘗試:

String.Format("{0:dd/MM/yyyy}", _date) 

返回的值是:

"24-05-1967" 

我要的是

"24/05/1967" 

任何人都可以解釋爲什麼我的格式字符串被忽略?

更多背景: 這是一個以.net 1.1開始的生活,並且正在將它移動到2.0/3.5的過程中。

更新:

如果我改變格式{0:DD:MM:YYYY},它返回24:05:1967年 - 這是隻有在被改爲格式字符串中的/ - 焦炭。


分辨率:

在更新應用程序2.0下運行,在asp.net全球化設置被搞砸了。

出於一些奇怪的原因,從Web站點屬性,ASP.NET選項卡,編輯配置,應用程序選項卡 - 文化和UI文化都設置爲列表中的第一項(af-ZA)。

回答

24

/實際上是您的特定文化的日期分隔符 - 換句話說,格式字符串不會被忽略但實際使用正確。看什麼的CultureInfo與正在運行的線程相關:

System.Threading.Thread.CurrentThread.CurrentCulture 

如果你試試這個:

String.Format(new CultureInfo("en-US"), "{0:dd/MM/yyyy}", DateTime.Now); 

你會得到與/格式的日期,因爲這是對的en-US正確的分隔符。什麼你應該做的是使用短日期格式字符串,並確保該線程相關聯的適當的文化,那麼這會得到你想要的東西,它會在一個全球化的應用程序以及工作:

DateTime.Now.ToString("d", Thread.CurrentThread.CurrentCulture); 

希望這可以幫助!

9

您可能想要使用DateTime對象的ToString()方法獲取您之後的字符串表示形式。格式字符串爲「dd」/'MM'/'yyyy「將爲您提供您描述的格式。請注意,您需要使用單引號轉義格式字符串中的文字字符。

例如:DateTime.Now.ToString("dd'/'MM'/'yyyy");

+0

謝謝,這工作 - 我不認爲你知道什麼時候該改變(1.1和3.5之間),並在它的記錄? – chris 2008-11-25 17:10:01

+0

請參閱.NET Framework 3.5:http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx(.NET 3.5)和.NET Framework 1.1:http://msdn.microsoft.com/en-us /library/8kb3ddd4(VS.71).aspx(.NET 1.1)以獲取詳細信息。它沒有出現針對自定義DateTime格式字符串更改的API。 – Oppositional 2008-11-25 20:46:45

0

這很奇怪。該格式對我來說是正確的。你可能想嘗試_date.ToString(「dd/MM/yyyy」)來代替(儘管這只是在黑暗中拍攝的)。

0

區域設置(在Web服務器上?)的日期分隔符設置爲' - '。在我的語言環境(EE)輸出將是「24.05.1967」:)

1

除非你指定IFormatProvider(通常是一個CultureInfo對象),它將默認使用Thread.CurrentThread.CurrentCulture的日期/時間格式,這將給你不斷變化的結果。

是的,它會改變/但不是:。

在這種情況下的解決方案是指定的格式提供,例如:

String.Format(CultureInfo.InvariantCulture, "{0:dd/MM/yyyy}", _date) 
1

的「/」字符是針對其在區域設置定義的日期時間分隔符培養中性佔位符。時間的「:」字符也是如此。

要以字面方式嵌入「/」而不是佔位符,您需要用格式字符串中的單引號「/」括起來。

0

這會給你你需要輸出

String.Format("{0:dd/MM/yyyy}", Convert.ToDateTime(_date)); 
0

有趣的線索!

我有一個應用程序讀取Excel文件,並讓用戶將其數據導出到用戶定義的的.csv文件中。

我特別想讓用戶能夠將日期導出爲(精確地)像yyyy/mm/dd這樣的格式,而不管他們的筆記本電腦的文化信息如何。

我試過幾個這些建議,但沒有工作的唯一一個是流行克特林的建議,封裝任意/字符,撇號:

outputFormat = outputFormat.Replace("/", "'/'"); 
valueToExport = ImportedDate.ToString(outputFormat); 

這似乎是迫使唯一方式ToString()使用確切的格式字符串,而不是試圖做任何文化特定的。

更新

我總是覺得很有趣,當我回答的StackOverflow問題,然後按同樣的錯誤,幾年後,和在我自己的答案絆倒!

正如許多這些答案中提到的,解決方案是將正斜槓字符包裝在撇號中,強制ToString()忽略文化設置。因此,如果您的文化設置包含日期分隔符(例如「20.07.2015」)的全站式字符,那麼您在嘗試精確設置聖誕節日期時會看到以下內容,以及您可以輕鬆將其強制總是使用正斜槓:

DateTime dtChristmas = new DateTime(2015, 12, 31); 

// This might return "31/12/2015", "31.12.2015", etc, depending on Culture settings 
string str1 = dtChristmas.ToString("dd/MM/yyyy"); 

// ...but these two statements will both *always* return "31/12/2015" 
string str2 = dtChristmas.ToString("dd'/'MM'/'yyyy"); 
string str3 = dtChristmas.ToString("dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture);