如何以yyyyMM格式检查有效日期

时间:2010-09-01 12:48:02

标签: c# .net string date

我有一个我的财务部门运行的内部业务流程。要开始它们,他们输入格式为yyyyMM201009的日期。我想从那个字符串中检查一个有效的日期,但到目前为止我什么都没有。

我正在探索打破这个字符串,取第4个并检查它们是在1990年到2050年之间(例如),然后是最后2个并检查它是在01到12之间。

有更好的方法吗?

5 个答案:

答案 0 :(得分:14)

您可以使用DateTime.TryParseExact查看是否可以正确解析它:

bool isValid = false;
DateTime dateValue;
if(DateTime.TryParseExact("201009", "yyyyMM", CultureInfo.InvariantCulture, 
                       DateTimeStyles.None, out dateValue))
{
   // DateTime parsed, dateValue contains the parsed DateTime

   // Can validate dateValue against business rules at this point
   isValid = (dateValue <= DateTime.Now && dateValue >= DateTime.Now.AddYears(-5));
}

如果您希望获得例外,可以使用DateTime.ParseExact

// Next line throws exception if format not correct
DateTime.ParseExact("201009", "yyyyMM", CultureInfo.InvariantCulture);

答案 1 :(得分:4)

您可以使用正则表达式:

if (Regex.IsMatch(input, @"^(199\d|20[0-5]\d)(0[1-9]|1[0-2])$")) {
  // valid input between 199001 and 205912
}

答案 2 :(得分:1)

我会选择DateTime.ParseExact:

DateTime d = DateTime.ParseExact("201009", "yyyyMM", System.Globalization.CultureInfo.InvariantCulture);

答案 3 :(得分:0)

这里的问题是格式“yyyyMM”不能代表特定的DateTime。因此,内置于DateTime的解析方法对你没有好处。

更新:没关系;我纠正了。 DateTime.TryParseExact工作得很好(如果你问我,这很讽刺);它会将你的字符串解释为代表给定月份的第一天。

我会做你所描述的:将字符串解析为两个数字组件,然后简单地将这些值与你需要它们的范围进行比较。

答案 4 :(得分:0)

我会被诱惑执行此操作作为数字范围问题:

UInt32 val;
if (input.Length != 6
   || !UInt32.TryParse(input, out val)
   || val > 205012
   || val < 199001
   || val % 100 > 12
   || val % 100 == 0) {
  // Invalid...
}