Perl 使用DateTime->compare()对日期排序
我尝试使用以下方法按时间顺序对一系列日期进行排序: 输出: 预期产出: %D相当于%m/%D/%y,其中%y是两位数的年份。您希望使用格式%m/%d/%Y来支持四位数年份。使用%D和%m/%D/%y,您的所有输入都被解释为2020年。%D相当于%m/%D/%y,其中%y是两位数的年份。您希望使用格式%m/%d/%Y来支持四位数年份。使用%D和%m/%D/%y,您的所有输入都被解释为2020年。[这是一个注释,而不是答案] 在这里使用DateTime太过分了Perl 使用DateTime->compare()对日期排序,perl,Perl,我尝试使用以下方法按时间顺序对一系列日期进行排序: 输出: 预期产出: %D相当于%m/%D/%y,其中%y是两位数的年份。您希望使用格式%m/%d/%Y来支持四位数年份。使用%D和%m/%D/%y,您的所有输入都被解释为2020年。%D相当于%m/%D/%y,其中%y是两位数的年份。您希望使用格式%m/%d/%Y来支持四位数年份。使用%D和%m/%D/%y,您的所有输入都被解释为2020年。[这是一个注释,而不是答案] 在这里使用DateTime太过分了 sub date_sort {
sub date_sort {
my ( $date1, $date2 ) = @_;
$date1 = sprintf '%3$s%1$02s%2$02s', split /\//, $date1;
$date2 = sprintf '%3$s%1$02s%2$02s', split /\//, $date2;
return $date1 cmp $date2;
}
my @res = sort { date_sort( $a->[1], $b->[1] ) } @dates;
更好的是
use Sort::Key qw( ikeysort );
sub date_key {
my ( $date ) = @_;
return sprintf '%3$s%1$02s%2$02s', split /\//, $date;
}
my @res = ikeysort { date_key( $_->[1] ) } @dates;
[这是评论而不是回答]
在这里使用DateTime太过分了
sub date_sort {
my ( $date1, $date2 ) = @_;
$date1 = sprintf '%3$s%1$02s%2$02s', split /\//, $date1;
$date2 = sprintf '%3$s%1$02s%2$02s', split /\//, $date2;
return $date1 cmp $date2;
}
my @res = sort { date_sort( $a->[1], $b->[1] ) } @dates;
更好的是
use Sort::Key qw( ikeysort );
sub date_key {
my ( $date ) = @_;
return sprintf '%3$s%1$02s%2$02s', split /\//, $date;
}
my @res = ikeysort { date_key( $_->[1] ) } @dates;
提示:如果您处理的是日期而不是时间,那么请使用时区=>“浮动”。使用本地时区可能会给您带来一些好处。提示:如果您处理的是日期而不是时间,那么请使用时区=>“浮动”。使用当地时区可以给你带来更多的好处。
use Sort::Key qw( ikeysort );
sub date_key {
my ( $date ) = @_;
return sprintf '%3$s%1$02s%2$02s', split /\//, $date;
}
my @res = ikeysort { date_key( $_->[1] ) } @dates;