Новая версия Perl библиотеки Moment. Метод для получения номера дня недели.

У меня есть простая библиотека для работы со временем Moment. Я ее использую в своих разных проектах. Появилась необходимость из даты получить номер дня недели. Моя библиотека не умела так делать, поэтому в проекте пришлось написать так:

my $weekday_number = get_weekday_number($moment);

sub get_weekday_number {
    my ($moment) = @_;

    my %n = (
        monday => 1,
        tuesday => 2,
        wednesday => 3,
        thursday => 4,
        friday => 5,
        saturday => 6,
        sunday => 7,
    );

    return $n{ $moment->get_weekday_name() };
}

Это, вроде как, работает, но выглядит плохо — явно чувствуется что это задача, которая должна решатся в библиотеке. Плохо копипастить такой код в каждом проекте, в котором понадобится выяснить номер для недели. Эта штука не обложена тестами, вроде ошибки тут нет, но всегда приятнее использовать кусок кода, про который знаешь, что он как-то тестируется.

Но есть вопрос — что считать первым днем недели? Тут в России первый день недели — это понедельник, и стандарт ISO 8601 тоже использует понедельник для первого дня недели, но, например, в США, первый день недели — это воскресенье. Википедия пишет что еще бывает суббота в качестве первого дня недели.

Я хочу чтобы моя библиотека Moment могла быть легко использована вне зависимости от того, какая система нумерации недель принята.

Поэтому я написал метод, которому нужно явно сказать что считать первым днем недели:

my $weekday_number = $moment->get_weekday_number( first_day => 'monday' );

Судя по википедии в качестве first_day стоит использовать только три дня: saturday, sunday, monday — только эти дни являются первыми днями недели в разных странах, но для консистентности я сделал возможность указывать в качестве 'first_day' любой день недели, возможно, где-нибудь это может пригодится (хотя я не могу представить ситуацию, где это может быть использовано).

Метод get_weekday_number() появлся в версии 1.2.0. Вот комит с реализацией — большоая часть изменения — это тесты и документация, а в самом методе большую часть кода занимает обработака ошибок. Еще интересный момент — для решений этой задачи я написал маленький скрипт, который выдает рандомные даты для всех 7 дней недели — именно эти даты я использую в тесте.

Иван Бессарабов
ivan@bessarabov.ru

1 мая 2015