在YY可能或可能不正确的YYyyMMDD格式日期,如果没有硬编码,您将如何纠正YY?

时间:2016-09-08 07:21:40

标签: perl validation date

我不确定这个问题是否适合这个问题,但无论如何我都会问。

我们从无法控制的来源获取数据。这些数据包含YYyyMMDD中的日期。问题是,数据源在他们的系统中有一个错误,使得日期的YY部分随机不正确,所以我们需要为它做一个解决方法。

所以我想我只是将日期的最后六位数字附加到今天的YY

substr($date_today,0,2).substr($date,-6)

但这些数据的年份不仅适用于今年,也适用于未来几年。

所以让我们说今天是2091-09-07,这个系统仍在运行,然后我们得到的日期是2102-08-06。然后我们也得到一个错误的年份的日期,如2302-09-04。我该如何纠正?我应该采取什么样的编码解决方案来解决这些错误?

我正在使用Perl btw。

2 个答案:

答案 0 :(得分:1)

如果您假设数据源的年数在过去或将来不超过50年,则可以使用以下子程序猜测当前年份的正确年份和年份的最后两位数字您的数据来源:

sub guess_year {
    my ($cur_year, $yy) = @_;

    my $cur_yy = $cur_year % 100;
    my $YY     = $cur_year - $cur_yy;

    if ($cur_yy < 50) {
        # Previous century.
        if ($yy >= $cur_yy + 50) { $YY -= 100; }
    }
    else {
        # Next century.
        if ($yy <  $cur_yy - 50) { $YY += 100; }
    }

    return $YY + $yy;
}

以下是几个测试用例:

sub test {
    my ($cur_year, $yy) = @_;

    my $guess = guess_year($cur_year, $yy);
    print("cur_year: $cur_year, yy: $yy, guess: $guess\n");
}

test(2016, 15);
test(2016, 17);
test(2016, 60);
test(2016, 70);
test(2080, 79);
test(2080, 81);
test(2080, 10);
test(2080, 40);

结果:

cur_year: 2016, yy: 15, guess: 2015
cur_year: 2016, yy: 17, guess: 2017
cur_year: 2016, yy: 60, guess: 2060
cur_year: 2016, yy: 70, guess: 1970
cur_year: 2080, yy: 79, guess: 2079
cur_year: 2080, yy: 81, guess: 2081
cur_year: 2080, yy: 10, guess: 2110
cur_year: 2080, yy: 40, guess: 2040

答案 1 :(得分:0)

关键是两个日期的yy(今天的日期和输入日期)之间的(数字)差异。当差值的大小为50或更大时,你需要从今天的YY(+1或-1)进行调整:

$todays_yy = substr($date_today,2,2);
$inputs_yy = substr($date,2,2);

$correct_YY = substr($date_today,0,2) + int(($todays_yy-$inputs_yy)/50);

print $correct_YY . substr($date,-6);