У меня есть простая библиотека для работы со временем 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 дней недели — именно эти даты я использую в тесте.
1 мая 2015