2014-04-22 80 views
0

我需要將此格式的一些字符串轉換爲DateTime 「MMM-yy」。我正在與文化「{ES-ES}」特定日期時間例外

它正常工作與所有月份除外月(在西班牙語馬索)。 這將引發我此異常:

'Convert.ToDateTime( 「MAR-13」)' 扔類型的異常 'System.FormatException' 的System.DateTime {System.FormatException}

我已經試過:

string format = "yyyyMM"; 
DateTime result; 
CultureInfo provider = CultureInfo.InvariantCulture; 
result = DateTime.ParseExact("Mar-13", format, provider); 

這:

DateTime date = Convert.ToDateTime("Mar-13"); 

這工作得很好,例如有:

「君-13」

「二月-13」

「十一月-13」

...

編輯 真正的問題是:

DateTime date = Convert.ToDateTime(「Ene-13」); - > ok

DateTime date = Convert.ToDateTime(「Feb-13」); - > ok

DateTime date = Convert.ToDateTime(「Mar-13」); - > crash

DateTime date = Convert.ToDateTime(「Abr-13」); - > ok

....

+0

我不明白。你在西班牙文化中是否有絃樂?即使將格式字符串修復爲'MMM-yy',Dic-13也不能轉換爲數據。 – Steve

+0

是的,我用西班牙語,我用InvariantCulture嘗試,因爲我發現它像一個可行的解決方案 – MCSI

+0

嘗試用' CultureInfo provider = new CultureInfo(「ES-es」)'並將格式修復爲MMM-yy – Steve

回答

4

您的日期字符串"Mar-13"與您的格式"yyyyMM"不符。你的格式應該是MMM-yy

你應該看到:Custom Date and Time Format Strings

在您的格式

「MMM」 - 縮寫月份的名稱。

「YY」 - 這一年,從00到99

編輯:

對於你的問題,爲什麼Convert.ToDateTime("Mar-13");失敗。你需要看看下面的代碼行:

var currentCulture = new CultureInfo("es-ES"); 
var monthNames = currentCulture.DateTimeFormat.AbbreviatedMonthNames; 
var dayOfWeeks = currentCulture.DateTimeFormat.AbbreviatedDayNames; 

如果你看在調試器返回的值,你會看到,文化es-ES有月份名稱和日期名稱,這是之間的比賽在mar

  • 馬索/ 3月爲月
  • 貂/週二日

這兩個使用相同的縮寫,即Mar。由於Convert.ToDateTime會嘗試使用字符串的可能格式,因此無法將Mar識別爲月份或日期名稱。這就是爲什麼你會得到例外。

使用DateTime.ParseExact並指定單個或multiple possible formats總是一個好主意。

+0

,但例如,如果我做「Abr-13」它工作正常。 只有與「Mar」 – MCSI

+0

@MCSI碰撞,'DateTime.ParseExact'在'「Abr-13」上工作'??? – Habib

+0

@MCSI,'DateTime result = DateTime.ParseExact(「Mar-13」,「MMM-yy」,new CultureInfo(「es-ES」));'這應該很好。 – Habib

4

您的格式和值不匹配。試試這個:

string format = "MMM-yy"; 
DateTime result; 
CultureInfo provider = CultureInfo.InvariantCulture; 
result = DateTime.ParseExact("Mar-13", format, provider); 

編輯

對於es-ES格式提供,我的猜測是,Mar馬索(3月)和(星期二)之間的曖昧。如果你使用ParseExact適當格式你應該罰款:

string format = "MMM-yy"; 
DateTime result; 
CultureInfo provider = CultureInfo.GetCultureInfo("es-ES"); 

// fails 
result = DateTime.Parse("Mar-13", provider); 

// works 
result = DateTime.ParseExact("Mar-13", format, provider); 
result = DateTime.ParseExact("Abr-13", format, provider); 

EDIT 2

這似乎是一個known bug。他們的解決辦法是使用一個類似文化,但如果您的日期格式是已知的,我推薦使用ParseExact明確定義格式,而不是讓框架嘗試推斷格式。

+0

如果在非西班牙語系統上使用CultureInfo.InvariantCulture,則嘗試轉換「abr-13」將失敗。 –

+0

你是對的,但正如我在之前的回答中所說的......真正的問題是當你沒有通過格式,例如:Convert.ToDateTime(「Mar-13」);與其他月份完美工作 – MCSI

1

我認爲你需要使用正確的CultureInfo和固定格式字符串

CultureInfo provider = new CultureInfo("ES-es"); 
DateTime result = DateTime.ParseExact("Abr-13", "MMM-yy", provider); 
2

參考我的答案背後自動日期時間的分析邏輯:How Convert.ToDateTime() parses a given string when the given culture does not know the format

可以在es-ES文化自動解析Abr-13,因爲Abr只能匹配爲MonthToken。但在Mar-13的情況下 - Mar可以匹配爲MonthToken,也可以匹配爲DayOfWeekToken(星期二),所以DateTime.Parse/Convert.ToDateTime方法會混淆並拋出異常。

如果從參考答案對es-ES文化執行的代碼,你會看到在輸出如下:

mar DayOfWeekToken 2 
    Mar MonthToken 3 

有全月的名字沒有多個匹配的,所以你可以放心地解析「馬索','abril'的價值觀。

由於DateTime.Parse/Convert.ToDateTime方法是通過這種雙重Mar價值的困惑,我們需要使用DateTime.ParseExact方法來提供一個暗示吧:

DateTime output = DateTime.ParseExact("Mar-13", "MMM-yy", CultureInfo.GetCultureInfo("es-ES")); 
0

您需要使用西班牙文化信息關聯於「 MMM-YY」格式:

 string format = "MMM-yy"; 
     DateTime result; 
     CultureInfo provider = new CultureInfo("es-ES"); 
     result = DateTime.ParseExact("mar-13", format, provider); 
     result = DateTime.ParseExact("abr-13", format, provider); 
0

在我的系統目前的文化是的en-US嘗試轉換ABR時,下面的代碼將失敗IL(4月):

string format = "MMM-yy"; 
DateTime result; 
CultureInfo provider = CultureInfo.InvariantCulture; 
result = DateTime.ParseExact("abr-13", format, provider); 

因此我的系統上我要創建一個西班牙文化的工作代碼:

string format = "MMM-yy"; 
DateTime result; 
CultureInfo provider = CultureInfo.CreateSpecificCulture("es-ES"); 
result = DateTime.ParseExact("abr-13", format, provider); 

所以,你需要知道你的代碼運行在什麼文化,採取適當的行動。