【问题标题】:How to check for valid Date in yyyyMM format如何检查 yyyyMM 格式的有效日期
【发布时间】:2011-04-06 19:05:38
【问题描述】:

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

我目前正在探索分解字符串,取前 4 个并检查它们是否在 1990 和 2050 之间(例如),然后是最后 2 个并检查它是否在 01 和 12 之间。

有没有更好的办法?

【问题讨论】:

  • 您申请的有效日期是什么时候? 1789 年 1 月 1 日可以吗?是 2200 年 2 月 15 日吗? 2011 年 16 月 12 日?
  • 今年将是一个商业决策,我猜是 5 年的范围,没有未来的一年。月份可以是任何月份,01-12。

标签: c# .net string date


【解决方案1】:

你可以使用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);

【讨论】:

  • 这接受像“000101”和“999901”这样的日期,所以你仍然需要检查年份是否是一个合理的值......
  • @Guffa - 好点。 OP 需要更明确地说明什么是他的申请的有效日期。
  • 感谢这个,小的后续问题。以下内容会给我我的期望吗?如果dateValue 不在未来并且不超过1 年,那么这是TRUE 结果? isValid = ((dateValue &lt;= DateTime.Today) &amp;&amp; ((dateValue.Year + DateTime.Today.AddYears(1).Year) &lt;= DateTime.Today.Year));
  • @Refracted Paladin - 布尔表达式的第二部分没有意义 - 您将解析的年份添加到明年(例如 2010 + 2011 并检查结果是否小于今年,它永远不会是)。试试isValid = ((dateValue &lt;= DateTime.Today) &amp;&amp; (dateValue &gt;= DateTime.Today.AddYears(-1))); - 第二个子句检查解析的日期是否大于一年前。
【解决方案2】:

你可以使用正则表达式:

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

【讨论】:

  • 加 1 用于正则表达式验证。这就是我要建议的。
【解决方案3】:

我会选择 DateTime.ParseExact:

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

【讨论】:

    【解决方案4】:

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

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

    我会按照您的描述进行:将字符串解析为两个数字分量,然后将这些值与您要求它们落入的任何范围进行比较。

    【讨论】:

    • TryParse 不适用于 201009 (yyyyMM),但 TryParseExact 可以。
    • @Anthony:对,我的错。完全符合我的意思。
    【解决方案5】:

    我很想将其作为数字范围问题来执行:

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

    【讨论】:

      猜你喜欢
      • 2014-05-31
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 2022-07-07
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多