2011-06-22 55 views
6

我環顧四周,寫了一大堆代碼來操作字符串,我想問問有沒有人知道一個很好的排序方法:日期時間問題,當天<= 12

我有一大堆的日期字符串在我拉出如細胞:

2011年3月5日
27/05/2011
31/05/2011
2011年3月5日
09/05/2011
31/05/2011

雖然我正在閱讀任何可以解釋爲一個月的日期 - 即上面的條目1,4和5 - ,它將作爲日期時間與日期和月份進行交換。

例如,03/05/2011獲取作爲日期時間讀入「05/03/2011 00:00:00」 其他人都閱讀,並很好地提供了一個簡單的字符串「27/05/2011" 。

我越來越從Excel這個信息,使用

((Excel.Range)worksheet.Cells[rowCount, 3]).Value.ToString() 

如果我嘗試值2,與我的其他線路,它讀取那些奇怪的日期象外之象「40607」,但再次,將讀取的其他日期一般。

+0

您使用的是什麼文化/語言環境? – Skurmedel

+0

@Skurmedel:en-GB(我對27/05/2011等日期的要求應該可以做到)但它似乎不是一個本地化問題。當只閱讀那些日期和月份周圍哪些方式可能不明確的日期時,它會有一種奇怪的行爲。所有其他的內容都是完美的。 – Aidan

回答

8

如果使用DateTime.ParseExact函數將字符串轉換爲DateTime對象,則可以指定日期使用的特定格式(看起來像「日/月/年」),而無需執行任何字符串操作。

例子:自定義日期和時間格式字符串

var dateString = "03/05/2011"; 

var format = "dd/MM/yyyy"; 

var date = DateTime.ParseExact(dateString, format, CultureInfo.InvariantCulture); 

更多信息,可以發現here


編輯:嘗試使用DateTime.FromOADate方法由Range.Value2屬性返回的值轉換爲DateTime對象,例如這樣的事情:

var dateTime = DateTime.FromOADate(((Excel.Range)worksheet.Cells[rowCount, 3]).Value2); 
+0

我試過這樣的事情。我的問題似乎是在讀取單元格中的值後立即讀取它作爲日期時間格式不正確,然後我甚至要求它。 但是,爲什麼它不會將其餘條目作爲DateTimes讀取?在閱讀細胞時,它是否真的會對CultureInfo進行仔細審查? – Aidan

+0

@Aidan然後它應該工作,ParseExact就是爲你的情況而創建的。 –

+0

@Donut,你不需要'/'在你的格式字符串中? –

0

問題是因爲您的日期正在被閱讀爲美國文化或類似。

如果您使用以下你可以指定你希望你的日期是在格式:使用指定的格式使用

DateTime result; 
if(DateTime.TryParseExact("dd/MM/yyyy", out result)) 
{ 
    // Got an English date 
} 
+1

非常真實,謝謝 – Ian

2

DateTime.ParseExact Method轉換的日期和時間的日期時間等同的指定字符串表示和文化特定的格式信息。

字符串表示的格式必須完全匹配指定的格式。

String dateString = "15/06/2008"; 
String format = "dd/MM/yyyy"; 

DateTime result = 
    DateTime.ParseExact(dateString, format, CultureInfo.InvariantCulture); 
1

這聽起來像是一個本地化問題。嘗試隱式設置您的語言環境。例如,在WPF應用程序是這樣的:在細胞

System.Threading.Thread.CurrentThread.CurrentCulture = 
    new System.Globalization.CultureInfo("en-US"); 
+0

將線程設置爲我的語言環境也無法解決問題。不過謝謝。 – Aidan

1

我有一大堆的日期字符串,我想要退出,如:

不,你不知道。你有看起來像日期和日期的字符串的組合,看起來像字符串。這是一個Excel問題,而不是C#問題。

不確定您是在創建電子表格,還是從其他位置獲取電子表格。但問題在於Excel試圖解析文本,因爲它是在單元格中輸入的。在這種情況下,它正在對它找到的日期做出一些錯誤的決定。

如果輸入「03/05/2011」這樣的日期,Excel將(錯誤地)將其解析爲2011年3月5日,並將其存儲爲數字日期代碼(40607)。然後它將日期格式應用於單元格(它在我的機器上使用m/d/yyyy)。

如果輸入「31/05/2011」之類的日期,則Excel無法將其解析爲日期,並將其作爲文本進行存儲。

爲了證明這一點,請選擇單元格並轉到編輯>清除>格式。所有的「糟糕的日期」只會顯示爲數字,其餘的將保持看起來像日期。

您有幾種選擇:

  1. 修復輸入Excel其之前的數據(前置一切以'所以它的所有輸入的文本,或確保具有一臺機器上創建電子表格)
  2. 請勿使用Excel中的.Value.ToString(),只需使用.Text即可。這將忽略Excel所做的錯誤解析,並且應該爲您提供一致的文本值(來自兩種類型),您可以使用C#ParseExact,根據其他答案。

(2)很容易,如果電子表格已經存在,可能是您唯一的選擇。

+0

是的,我想到這一點,以及我正在尋找其他有類似問題的人。使用.Text返回我「########」,而不是輸入內容。我認爲這是Excel所做的一些奇怪的事情,但對於我來說,我似乎無法繞開它。所有單元格已經格式化並設置爲正確的語言環境,但是,將它們設置爲文本將顯示40607個樣式條目。我寧願在閱讀之前不必改變單元格格式,但它開始看起來不會有選擇...... – Aidan

+0

'.Text'從字面上返回電子表格中顯示的內容(在應用了所有格式之後,等等。 )所以它返回「######」的唯一方法是列的寬度不足以顯示日期格式。它是否在電子表格中直接顯示「#####」?你可以擴大列,所以它不? – BradC

+0

並改變單元格格式不會解決問題。 Excel字面上解析了日期錯誤,它交換了月份和日期值。您可以通過更改爲「2011年6月22日」樣式格式來驗證。 – BradC