我已经环顾了很多,没有编写一大堆代码来操纵字符串,我想问一下是否有人知道一种很好的排序方式:
我在单元格中有一堆日期字符串,例如:
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”之类的内容,但同样会再次读取其他日期。
答案 0 :(得分: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);
答案 1 :(得分:2)
DateTime.ParseExact Method使用指定的格式和特定于文化的格式信息将日期和时间的指定字符串表示形式转换为其DateTime等效项。
字符串表示的格式必须与指定的格式完全匹配。
String dateString = "15/06/2008";
String format = "dd/MM/yyyy";
DateTime result =
DateTime.ParseExact(dateString, format, CultureInfo.InvariantCulture);
答案 2 :(得分:1)
这听起来像是本地化问题。尝试隐式设置您的语言环境。例如,在WPF应用程序中,它类似于:
System.Threading.Thread.CurrentThread.CurrentCulture =
new System.Globalization.CultureInfo("en-US");
答案 3 :(得分:1)
我在单元格中有一堆日期字符串,例如:
不,你没有。您可以混合使用字符串看起来像日期和日期看起来像字符串。这是一个Excel问题,而不是C#问题。
不确定您是在创建电子表格,还是从其他地方获取电子表格。但问题是Excel尝试解析在单元格中输入的文本 。在这种情况下,它会对找到的日期作出一些错误的决定。
如果输入“03/05/2011”之类的日期,Excel将(错误地)将其解析为2011年3月5日,并将其存储为数字日期代码(40607)。然后它将日期格式应用于单元格(它在我的机器上使用m / d / yyyy)。
如果输入“31/05/2011”之类的日期,则Excel无法将其解析为日期,并将其存储为文本。
要证明这一点,请选择单元格,然后转到编辑>清除>格式。所有“糟糕的日期”都会显示为数字,其余的都会看起来像日期。
您有几个选择:
.Value.ToString()
,只需使用.Text
即可。这将忽略Excel执行的错误解析,并且应该为您提供一致的文本值(来自两种类型),您可以使用C#ParseExact
,根据其他答案。(2)更容易,如果电子表格已经存在,可能是您唯一的选择。
答案 4 :(得分:0)
问题在于您的日期被视为美国文化或类似文化。
如果您使用以下内容,则可以指定日期所在的格式:使用
DateTime result;
if(DateTime.TryParseExact("dd/MM/yyyy", out result))
{
// Got an English date
}