当天<= 12时的DateTime问题

我已经环顾了很多,没有编写一大堆代码来操作字符串,我想问一下是否有人知道一种很好的排序方式:

我在单元格中有一堆日期字符串,例如:

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

当我正在阅读任何可以将这一天解释为一个月的情况 – 即上面的条目1,4和5时 – 它将作为日期时间与日期和月份交换。

例如,03/05/2011将作为DateTime“05/03/2011 00:00:00”读入。其他人都已阅读并且很好地为我提供了一个简单的字符串“27/05/2011”。

我从Excel中获取此信息,使用

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

如果我像我的其他行一样尝试Value2,它会将那些奇怪的日期读作“40607”之类的内容,但同样会再次读取其他日期。

如果使用DateTime.ParseExact函数将字符串转换为DateTime对象,则可以指定日期使用的特定格式(看起来像“日/月/年”),而无需进行任何字符串操作。

例:

 var dateString = "03/05/2011"; var format = "dd/MM/yyyy"; var date = DateTime.ParseExact(dateString, format, CultureInfo.InvariantCulture); 

有关自定义日期和时间格式字符串的更多信息,请参见此处 。


编辑:尝试使用DateTime.FromOADate方法将Range.Value2属性返回的值转换为DateTime对象,例如:

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

DateTime.ParseExact方法使用指定的格式和特定​​于区域性的格式信息将指定的日期和时间字符串表示forms转换为其DateTime等效项。

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

 String dateString = "15/06/2008"; String format = "dd/MM/yyyy"; DateTime result = DateTime.ParseExact(dateString, format, CultureInfo.InvariantCulture); 

这听起来像是本地化问题。 尝试隐式设置您的区域设置。 例如在WPF应用程序中,它类似于:

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

我在单元格中有一堆日期字符串,例如:

不,你没有。 你有一些混合的字符串,看起来像日期日期看起来像字符串 。 这是一个Excel问题,而不是C#问题。

不确定您是在创建电子表格,还是从其他地方获取电子表格。 但问题是Excel尝试解析在单元格中输入的文本。 在这种情况下,它正在对它找到的日期作出一些错误的决定。

如果输入“03/05/2011”之类的日期,Excel将(错误地)将其解析为2011年3月5日,并将其存储为数字日期代码(40607)。 然后它将日期格式应用于单元格(它在我的机器上使用m / d / yyyy)。

如果输入“31/05/2011”之类的日期,则Excel无法将其解析为日期,并将其存储为文本。

要certificate这一点,请选择单元格,然后转到编辑>清除>格式。 所有“糟糕的日期”只会显示为数字,其余的将保持看起来像日期。

你有几个选择:

  1. 在数据输入Excel之前修复数据(在所有内容前加上’所有输入为文本,或确保在具有正确日期设置的计算机上创建电子表格。)
  2. 不要使用Excel中的.Value.ToString() ,只需使用.Text 。 这将忽略Excel所做的错误解析,并且应该为您提供一致的文本值(来自两种类型),您可以使用ParseExact #与其他答案进行ParseExact

(2)更容易,如果电子表格已经存在,可能是您唯一的选择。

问题是因为您的日期被视为美国文化或类似文化。

如果您使用以下内容,则可以指定日期所在的格式:使用

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