четверг, 3 ноября 2011 г.

Вопрос про проектирование интерфейса класса
Мне тут недавно приснилось (сам в шоке!), что я хочу к дате прибавлять и отнимать 1 месяц.
Возник интересный вопрос (и тут же пачка следом, привожу в порядке появления)
1) Что будет, если к 3 ноября прибавить 1 месяц? Вроде как 3 декабря.
2) Что будет, если к 28 января прибавить 1 месяц? 28 февраля по идее...
3) Идем дальше, 29 января? Тут есть нюанс ;) Думаю, наилучший выход, если выходим за диапазон дней месяца, ставить 1 число следующего и не париться.
4) Если у нас сложение работает как в п.3, то 29.01, 30.01, 31.01 и 1.02 после прибавления 1 месяца становятся одной датой - 1 марта.
5) А самое интересное начинается при вычитании 1 месяца. Оказывается, что (30.01 + 1 месяц) - 1 месяц = 1 февраля, а (30.01 - 1 месяц) + 1 месяц = 30 января.

Вот такие вот пирожки...

2 комментария:

  1. Это нормально. :)

    4 use DateTime;
    5
    6 my $dt = DateTime->new(
    7
    8 year => '2003',
    9 month => '1',
    10 day => '30',
    11 hour => '1',
    12 minute => '1',
    13 second => '1',
    14 time_zone => 'local',
    15 );
    16
    17 print "Now: $dt\n";
    18
    19 $dt->add( months => 1 );
    20
    21 print "+1 Month: $dt\n";
    22
    23 $dt->subtract( months => 1 );
    24
    25 print "-1 Month: $dt\n";

    Выдаст:

    Now: 2003-01-30T01:01:01
    +1 Month: 2003-03-02T01:01:01
    -1 Month: 2003-02-02T01:01:01

    Об этом даже в документации на любой нормальный модуль времении написано: операции не реверсивны и зависят от порядка.

    А ещё там есть такие приколы как leap_second и переходы на летнее время и обратно. ;)

    Время - удивительная вещь!

    ОтветитьУдалить