我看了很多遍,没有写一段可怕的代码来处理字符串,我想问是否有人知道一种很好的排序方法:
我在提取的单元格中有一堆日期字符串,例如:
2011年5月3日
2011年5月27日
2011年5月31日
2011年5月3日
2011年5月9日
2011年5月31日
等
当我阅读任何一个日期可以被解释为一个月的整数时,即上面的条目1、4和5,它被放为DateTime,日期和月份被交换。
例如,2011年5月3日读取为DateTime"2011年3月5日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);
有关自定义日期和时间格式字符串的更多信息,请访问此处。
EDIT:尝试使用DateTime.FromOADate
方法将Range.Value2
属性返回的值转换为DateTime
对象,例如:
var dateTime = DateTime.FromOADate(((Excel.Range)worksheet.Cells[rowCount, 3]).Value2);
DateTime。ParseExact方法使用指定的格式和区域性特定的格式信息,将指定的日期和时间字符串表示形式转换为等效的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试图在单元格中输入文本时解析文本。在这种情况下,它对找到的日期做出了一些错误的决定。
如果您输入的日期类似于"2011年5月3日",Excel将(错误地)将其解析为2011年3月5日,并将其存储为数字日期代码(40607)。然后,它将日期格式应用于单元格(在我的机器上使用m/d/yyyy)。
如果输入的日期类似于"2011年5月31日",Excel无法将其解析为日期,而是将其存储为文本。
要证明这一点,请选择单元格,然后转到"编辑">"清除">"格式"。所有"糟糕的约会"都会显示为数字,其余的都会看起来像约会。
你有几个选择:
- 在数据输入Excel之前修复数据(在所有内容前加上"so its all input as text",或者确保在具有正确日期设置的机器上创建电子表格。)
- 不要使用Excel中的
.Value.ToString()
,只使用.Text
即可。这将忽略Excel所做的糟糕解析,并且应该为您提供一个一致的文本值(来自两种类型),根据其他答案,您可以使用C#ParseExact
(2) 更容易,如果电子表格已经存在,可能是您唯一的选择。
问题是因为你的约会被解读为美国文化或类似文化。
如果您使用以下格式,您可以指定您希望的日期格式:使用
DateTime result;
if(DateTime.TryParseExact("dd/MM/yyyy", out result))
{
// Got an English date
}