Сортировать даты, используя DateTime-> compare () - PullRequest
1 голос
/ 29 апреля 2019

Я пытаюсь отсортировать массив дат в хронологическом порядке, используя DateTime:

use strict;
use warnings;
use Data::Printer;
use Date::Time;
use DateTime::Format::Strptime;

my $strp = DateTime::Format::Strptime->new(
    pattern   => '%D',
    time_zone => 'America/New_York',
);
 my @dates = (
    [1, '5/18/2011'],
    [2, '6/18/2011'],
    [3, '6/18/2014'],
    [4, '6/18/2010'],
);

my @res = sort { date_sort( $a->[1], $b->[1], $strp ) } @dates;

p \@res;

sub date_sort {
    my ( $date1, $date2, $strp ) = @_;

    my $dt1 = $strp->parse_datetime($date1);
    my $dt2 = $strp->parse_datetime($date2);
    return DateTime->compare($dt1, $dt2);
}

Вывод :

[
    [0] [
        [0] 1,
        [1] "5/18/2011"
    ],
    [1] [
        [0] 2,
        [1] "6/18/2011"
    ],
    [2] [
        [0] 3,
        [1] "6/18/2014"
    ],
    [3] [
        [0] 4,
        [1] "6/18/2010"
    ]
]

Ожидаемый результат :

[
    [0] [
        [0] 4,
        [1] "6/18/2010"
    ],
    [1] [
        [0] 1,
        [1] "5/18/2011"
    ],
    [2] [
        [0] 2,
        [1] "6/18/2011"
    ],
    [3] [
        [0] 3,
        [1] "6/18/2014"
    ]
]

Ответы [ 2 ]

3 голосов
/ 29 апреля 2019

[ Это комментарий, а не ответ ]

Использование 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;
3 голосов
/ 29 апреля 2019

%D эквивалентно %m/%d/%y, где %y - двухзначный год.Вы хотите использовать формат %m/%d/%Y для поддержки четырехзначного года.С %D%m/%d/%y) все ваши данные интерпретируются как имеющие 2020 год.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...