我有一个内部业务流程,我的财务部门运行。要启动它,他们输入格式为yyyyMM
或201009
的日期。我想检查该字符串的有效日期,但到目前为止我什么都没有。如何检查yyyyMM格式的有效日期
我目前正在探索打破串起来,取第一4和检查它们是1990年和2050年之间(如实施例),然后将最后的2和检查,这是01和12。
之间是有更好的方法吗?
我有一个内部业务流程,我的财务部门运行。要启动它,他们输入格式为yyyyMM
或201009
的日期。我想检查该字符串的有效日期,但到目前为止我什么都没有。如何检查yyyyMM格式的有效日期
我目前正在探索打破串起来,取第一4和检查它们是1990年和2050年之间(如实施例),然后将最后的2和检查,这是01和12。
之间是有更好的方法吗?
您可以使用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 2010-09-01 13:21:14
@Guffa - 好点。 OP需要更明确地指出为他的申请制定了有效的日期。 – Oded 2010-09-01 13:26:54
感谢您的回复,小问题。下列会给我什么我期望的;如果'dateValue'不在将来,并且过去不超过1年,这是'TRUE'结果? 'isValid =((dateValue <= DateTime.Today)&&((dateValue.Year + DateTime.Today.AddYears(1).Year)<= DateTime.Today.Year));' – 2010-09-01 17:40:57
这里的问题是,格式“yyyyMM”不能表示特定的DateTime
。因此,DateTime
内置的解析方法对你没有好处。
更新:没关系;我立场纠正。 DateTime.TryParseExact
将工作得很好(如果你问我,这很具有讽刺意味);它会解释你的字符串来表示给定月份的第一天。
我会做你所描述的:将字符串解析为两个数字组件,并简单地将这些值与你需要它们的范围进行比较。
'TryParse'不适用于201009(yyyyMM),但是'TryParseExact'。 – 2010-09-01 12:55:59
@Anthony:对,我的不好。完全是我的意思。 – 2010-09-01 13:00:34
我会去与DateTime.ParseExact:
DateTime d = DateTime.ParseExact("201009", "yyyyMM", System.Globalization.CultureInfo.InvariantCulture);
您可以使用正则表达式:
if (Regex.IsMatch(input, @"^(199\d|20[0-5]\d)(0[1-9]|1[0-2])$")) {
// valid input between 199001 and 205912
}
加1用于正则表达式验证。这就是我要建议的。 – xdumaine 2010-09-01 12:56:12
我会忍不住执行此为一个数字范围问题:
UInt32 val;
if (input.Length != 6
|| !UInt32.TryParse(input, out val)
|| val > 205012
|| val < 199001
|| val % 100 > 12
|| val % 100 == 0) {
// Invalid...
}
什么是您申请的有效日期?是01/01/1789行吗?是15/02/2200吗? 16/12/2011? – Oded 2010-09-01 13:29:46
这一年将是一个商业决策,我猜想5年的范围,没有未来的一年。月份将是01-12的任何月份。 – 2010-09-01 14:01:57