日期< = 12时的DateTime问题

时间:2011-06-22 14:11:19

标签: c# 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”之类的内容,但同样会再次读取其他日期。

5 个答案:

答案 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无法将其解析为日期,并将其存储为文本。

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

您有几个选择:

  1. 在数据输入Excel之前修复数据(在所有内容前加上'所有输入为文本,或确保在具有正确日期设置的计算机上创建电子表格。)
  2. 请勿使用Excel中的.Value.ToString(),只需使用.Text即可。这将忽略Excel执行的错误解析,并且应该为您提供一致的文本值(来自两种类型),您可以使用C#ParseExact,根据其他答案。
  3. (2)更容易,如果电子表格已经存在,可能是您唯一的选择。

答案 4 :(得分:0)

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

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

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