2013-11-28 31 views
2
var d=DateTime.Parse("03-02-2013"); 
Console.Write(d.Month); //2 

1)Dateime.parse如何知道: -是分隔符? -不是標準分隔符(http://msdn.microsoft.com/en-us/library/az4se3k1.aspx在DateTime.Parse連字符?

2)它怎麼知道月份是2而不是3?是由區域設置嗎? (我改變了我的區域設置,並沒有改變)...我試圖找到一個MSDN的參考,但找不到任何。

這是我DateTimeFormatInfo.CurrentInfo數據:

enter image description here

+0

但是'DateTimeFormatInfo.CurrentInfo.GetAllDateTimePatterns()'返回什麼? –

回答

2

DateTime.Parse而不是DateTime.ParseExact試圖盡最大努力解析您的日期。這意味着它允許多個不同的日期分隔符,包括/,-,.(空格)。但是,日期的組成部分的順序仍然是從DateTimeFormatInfo.CurrentInfo推斷出來的,在您的情況下,這意味着該日在該月份之前。

所以你的希伯來文化DateTime.Parse("03-02-2013")返回2013年2月3日,同時呼籲DateTime.Parse("03-02-2013", CultureInfo.InvariantCulture)將返回2013年3月2日,因爲不變文化是基於具有一個月前一個月的en-US文化。

究竟如何DateTime.Parse的行爲是有點難以弄清楚,所以以下信息可能不完全準確。我相信DateTime.Parse會嘗試尋找各種格式,其中可能包括D,d,y,T,t以及DateTimeFormat.MonthDayPattern定義的模式。

new[] { 'D', 'd', 'y', 'T', 't' } 
    .SelectMany(p => dateTimeFormatInfo.GetAllDateTimePatterns(p)) 
    .Concat(new[] { dateTimeFormatInfo.MonthDayPattern }) 

希伯來文化,我得到以下列表:給定一個DateTimeFormatInfo您可以使用此代碼得到的所有模式

 
dddd dd MMMM yyyy 
dd MMMM yyyy 
dddd dd 'ב'MMMM yyyy 
ddd dd 'ב'MMMM yyyy 
dd 'ב'MMMM yyyy 
dd/MM/yyyy 
dd MMMM yyyy 
dd/MM/yy 
dd/MMMM/yyyy 
dd-MM-yy 
dd-MM-yyyy 
dd-MMMM-yyyy 
yyyy-MM-dd 
dd 'ב'MMMM yyyy 
dd MMM yy 
MMMM yyyy 
HH:mm:ss 
hh:mm:ss tt 
HH:mm 
hh:mm tt 
dd MMMM 

該名單包括dd-MM-yyyy,但同樣,這個名單可能不完全準確。

+0

如果您有任何疑問,請參考官方文檔。和(空間)'? – d11

+0

@ doomday1:我不能,但我嘗試了不同的分隔符,並發現這些(但允許可能因文化不同而不同)。我還查看了源代碼,但解析器非常複雜,除了希伯來文化有很多特殊處理(我認爲這不適用於您的問題)之外,我找不到任何具體的東西。 –

+1

在我的機器上,'(new CultureInfo(「he-IL」))。DateTimeFormat.GetAllDateTimePatterns()[5]'給出了「dd-MM-yyyy」',文化_Hebrew(以色列)_有一些破折號。不知道這是否取決於我的操作系統的設置和區域版本。您的答案仍然可以正確,因爲'DateTime.Parse'可能會嘗試解析不在'GetAllDateTimePatterns()'列表中的東西。 –

1

DateTime.Parse基於當前文化。在這裏,它是如何在.NET中推動的;

public static DateTime Parse(string s) 
{ 
    return DateTimeParse.Parse(s, DateTimeFormatInfo.CurrentInfo, DateTimeStyles.None); 
} 

我認爲你目前的文化日期seperetor是-這就是它的工作原因。

DateTimeFormatInfo.CurrentInfo

獲取格式化基於所述當前培養 值只讀DateTimeFormatInfo對象。

編輯:Okey,我要深入這個話題。正如我在網上找到的,DateTime.Parse支持很多格式。例如;

Standart Time "1/1/2000" 
HTTP Header "Fri, 27 Feb 2009 03:11:21 GMT"; 
w3.org "2009/02/26 18:37:58"; 
nytimes "Thursday, February 26, 2009" 
Standart Time "February 26, 2009"; 
ISO Standard 8601 for Dates "2002-02-10"; 
Windows file system Created/Modified "2/21/2009 10:35 PM"; 
Windows Date and Time panel "8:04:00 PM"; 

它是如何知道的月份是2,而不是3?

這是所有關於您的文化。隨着InvariantCulture它返回3,在您的文化中,它返回2由於標準的日期時間格式。

+0

不......看看我的編輯(在DateSeparator) – d11

+0

@ doomday1你的文化到底是什麼? –

+0

he-IL .......... – d11