我很想确定事件的原始年份,然后添加足够的整年,以确保该值大于您的参考日期(通常是今天的日期)。或者,可能大于或等于参考日期。然后您可以按简单的日期顺序进行排序。
编辑添加:
我的 PHP 不够流利,无法给出答案,但这里有一个 Perl 解决方案。
#!/bin/perl -w
# Sort sequence of dates by next occurrence of anniversary.
# Today's "birthdays" count as low (will appear first in sequence)
use strict;
my $refdate = "2008-10-05";
my @list = (
"1980-04-14", "2007-06-08",
"2008-12-25", "1978-11-03",
"2008-10-04", "2008-10-05",
"2008-10-06", "2008-02-29"
);
sub date_on_or_after
{
my($actdate, $refdate) = @_;
my($answer) = $actdate;
if ($actdate lt $refdate) # String compare OK with ISO8601 format
{
my($act_yy, $act_mm, $act_dd) = split /-/, $actdate;
my($ref_yy, $ref_mm, $ref_dd) = split /-/, $refdate;
$ref_yy++ if ($act_mm < $ref_mm || ($act_mm == $ref_mm && $act_dd < $ref_dd));
$answer = "$ref_yy-$act_mm-$act_dd";
}
return $answer;
}
sub anniversary_compare
{
my $r1 = date_on_or_after($a, $refdate);
my $r2 = date_on_or_after($b, $refdate);
return $r1 cmp $r2;
}
my @result = sort anniversary_compare @list;
print "Before:\n";
print "* $_\n" foreach (@list);
print "Reference date: $refdate\n";
print "After:\n";
print "* $_\n" foreach (@result);
显然,这不是非常有效 - 为了使其有效,您需要计算一次 date_on_or_after() 值,然后对这些值进行排序。 Perl 的比较有点奇怪 - 变量 $a 和 $b 很神奇,看起来好像是凭空出现的。
运行时,脚本会产生:
Before:
* 1980-04-14
* 2007-06-08
* 2008-12-25
* 1978-11-03
* 2008-10-04
* 2008-10-05
* 2008-10-06
* 2008-02-29
Reference date: 2008-10-05
After:
* 2008-10-05
* 2008-10-06
* 1978-11-03
* 2008-12-25
* 2008-02-29
* 1980-04-14
* 2007-06-08
* 2008-10-04
请注意,它在很大程度上回避了 2 月 29 日发生的事情的问题,因为这样做“有效”。基本上,它将生成“日期”2009-02-29,它按顺序正确比较。 2000-02-28 的周年纪念日将在 2008-02-29 的周年纪念日之前列出(如果 2000-02-28 包含在数据中)。