使用不一致的格式解析日期

时间:2010-12-16 23:34:13

标签: c# datetime

如何在不一致的情况下编写我正在尝试解析的日期格式?

DateTime.TryParse(date, out dateParsed);
            sale.DateProcessed = dateParsed;

处理错误,指定新格式,并继续尝试不同的格式?

或者有没有办法一次性完成?

这是我的数据的摘录,正如您所看到的那样格式化不一致:

十一月09

十月09

09年9月

09年5月

三月09

二月09

一月09

十二月08

十一月08

十月08

九月08

08年8月

08年7月

2008年6月

08年5月

08年4月

08年3月

2008年2月

08年1月

07年12月

2007年11月

6 个答案:

答案 0 :(得分:3)

将DateTime.TryParseExact与自定义格式数组一起使用:

DateTime.TryParseExact(
  dateString,
  new String[]{
    "MMM yy",
    "MMM. yy",
    "MMM\\t. yy",// for 4-letters Sept.
    "MMMM yy"}, // full name of month 
  New CultureInfo("en-US"),
  DateTimeStyles.None,
  dateValue
);

答案 1 :(得分:1)

如果这代表您的数据,您可以按摩每一个并且:

1)将月份切换为三个字母的缩写(string.Substring应该做的伎俩)
2)在年底前加上“20”

然后从那里解析?还是有更多格式要处理?总而言之,您的数据实际上非常一致。

答案 2 :(得分:1)

这样做:

date = date.Substring(0, 3) + " 20" + date.Substring(date.IndexOf(' ') + 1);

答案 3 :(得分:0)

我只有一个字典,其中包含短月份名称到完整月份名称的映射Jan =>一月。然后在解析转换短名称到长名称之前。

答案 4 :(得分:0)

  • 使用空格作为分隔符对每一行进行标记
  • 前三个字母为您提供所有情况下的月份
  • 将第二个令牌转换为整数并为其添加2000,以获得年份。

答案 5 :(得分:0)

你走了:

DateTime GetDate(string raw){
  int month;
  switch(raw.Substring(0,3).ToLower()){
    case "jan": month = 1; break;
    case "feb": month = 2; break;
    ...
    case "dec": month = 12; break;
    default: throw new ArgumentException("raw", "Failed to parse month");
  }
  int year = int.Parse("20" + raw.Substring(raw.Length - 2));
  return new DateTime(year, month, 1);
}