日期时间问题,当天<;=12

本文关键字:lt 当天 时间 问题 日期 | 更新日期: 2023-09-27 18:00:06

我看了很多遍,没有写一段可怕的代码来处理字符串,我想问是否有人知道一种很好的排序方法:

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

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"之类的内容,但同样,它会正常读取其他日期。

日期时间问题,当天<;=12

如果使用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无法将其解析为日期,而是将其存储为文本。

要证明这一点,请选择单元格,然后转到"编辑">"清除">"格式"。所有"糟糕的约会"都会显示为数字,其余的都会看起来像约会。

你有几个选择:

  1. 在数据输入Excel之前修复数据(在所有内容前加上"so its all input as text",或者确保在具有正确日期设置的机器上创建电子表格。)
  2. 不要使用Excel中的.Value.ToString(),只使用.Text即可。这将忽略Excel所做的糟糕解析,并且应该为您提供一个一致的文本值(来自两种类型),根据其他答案,您可以使用C#ParseExact

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

问题是因为你的约会被解读为美国文化或类似文化。

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

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