奇怪的日期计算和测试

时间:2009-08-21 05:45:56

标签: c# .net datetime

有人可以解释以下代码检查的内容吗?我不能理解它,但不想因为无知而把它从我的重写中删除。完整代码计算现在与detailLastDate之间的差异,即Days(detailLastDate) - Days(Now)。对于这种情况,detailLastDate的值为'090722':

int num3 = 0;
num3 = int.Parse(detailLastDate.Substring(0, 1) + int.Parse(detailLastDate.Substring(1, 1) + int.Parse(detailLastDate.Substring(2, 1) + int.Parse(detailLastDate.Substring(3, 1) + int.Parse(detailLastDate.Substring(4, 1) 
    + int.Parse(detailLastDate.Substring(0, 1) + int.Parse(detailLastDate.Substring(1, 1) + int.Parse(detailLastDate.Substring(2, 1) + int.Parse(detailLastDate.Substring(3, 1) + int.Parse(detailLastDate.Substring(5, 1);
if (num3 == 0)
{
    detailLastDate = "991231";
}

ADDED:令我困惑的是为什么它会两次解析字符0到3。

4 个答案:

答案 0 :(得分:5)

嗯,难怪你无法理解它,因为它毫无意义:)

首先,它的目的似乎是检查传递的日期是否为“000000”。它还会检查所有数字是否实际上都是数字。如果他们不是,那将是一个例外。如果字符串的长度小于6,也会有例外。

如果日期为“000000”,则默认为“991231”。

这应该是大多数等价,假设num3不用于其他奇怪的比较:

int num3;
if (detailLastDate.Length != 6 || !Int32.TryParse(detailLastDate, out num3))
    throw new FormatException("Invalid date");

if (num3 == 0)
    detailLastDate = "991231";

字符串上的错误太长了(与你的代码片段不同),但我认为这是一件好事。就个人而言,我完全摆脱了整数解析,但我猜它有效:)

如果你想以正确的方式进行一些重构,请看看CMS的回答。请确保周围的代码不依赖于我描述的副作用。

答案 1 :(得分:2)

您可以根据格式yyMMdd解析日期,并使用DateTime.TryParseExact方法查看转换是否成功。

一个例子:

//...
string detailLastDate = "090722";
DateTime lastDate;

if (!DateTime.TryParseExact(detailLastDate, "yyMMdd",
                CultureInfo.InvariantCulture, DateTimeStyles.None, out lastDate))
{
    // input doesn't match the format
    lastDate = new DateTime(1999, 12, 31); // default value 991231
}
//...
return (lastDate - DateTime.Today).Days;

答案 2 :(得分:1)

它看起来像检查日期是否全是零,如果是,默认为991231(1999年12月31日?)

答案 3 :(得分:1)

好吧,首先代码不能编译,因为括号不匹配。原始代码是什么样的?

如果添加括号,代码仍然没有多大意义。它只是一次解析一个字符而且多次解析大多数字符,而它只能解析整个字符串。

如果你知道字符串总是六个字符并且总是包含数字,那么你不需要通过解析字符串来提供代码所提供的额外验证,你只需将其替换为:

if (detailLastDate == "000000") detailLastDate = "991231";