Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Интервал дат. 
V
    Опции темы
GoodBoy
Дата 7.4.2006, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

Репутация: 2
Всего: 83



Задача: есть 2 даты (к примеру 12/11/2003 и 08/06/2005), как получить все даты между ними? Есть ли модуль, который позволит это сделать?


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
korob2001
Дата 7.4.2006, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Код

#!/usr/bin/perl -w
use strict;
use Time::Local;

my $first = "12/11/2003";
my $second = "08/06/2005";

my($fday, $fmonth, $fyear) = $first =~ /^(\d+)\/(\d+)\/(\d+)$/;
my($sday, $smonth, $syear) = $second =~ /^(\d+)\/(\d+)\/(\d+)$/;

my $fepoch = timelocal(0,0,0,$fday,$fmonth-1,$fyear-1900);
my $sepoch = timelocal(0,0,0,$sday,$smonth-1,$syear-1900);

($fepoch,$sepoch) = ($sepoch,$fepoch) if $fepoch > $sepoch;

for (my $i=$fepoch; $i < $sepoch; $i += 24 * 60 * 60) {
     print scalar localtime($i), "\n";
}

Сначала преобразуем даты в секунды, с начала эпохи. Затем шагаем от меньшей даты, к большей по 24 часа и преобразуем назад из секунд в дату. Если тебе нужны даты в том же формате, думаю ты знаешь, что делать в цикле с localtime. smile

Это сообщение отредактировал(а) korob2001 - 7.4.2006, 12:27


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
GoodBoy
Дата 7.4.2006, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

Репутация: 2
Всего: 83



с уточнением, т. к. месяцы нумеруются с 0, а не с 1:

Код
#!/usr/bin/perl -w
use strict;
use Time::Local;

my $first = "12/02/2004";
my $second = "08/03/2004";

my @f = ($first =~ /^(\d+)\/(\d+)\/(\d+)$/);
my @s = ($second =~ /^(\d+)\/(\d+)\/(\d+)$/);

my $fepoch = timelocal(0,0,0,$f[0],$f[1]-1,$f[2]);
my $sepoch = timelocal(0,0,0,$s[0],$s[1]-1,$s[2]);

($fepoch,$sepoch) = ($sepoch,$fepoch) if $fepoch > $sepoch;

for (my $i=$fepoch; $i < $sepoch; $i += 24 * 60 * 60) {
     print scalar localtime($i), "\n";
}


korob2001, Огромное спасибо!!!! :-)))))))))))


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
nitr
Дата 7.4.2006, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Есть конечно и модуль Date::Calc см. тут, качаем здесь


--------------------
PM   Вверх
Kiber_rat
Дата 8.4.2006, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MACMANIAC
**


Профиль
Группа: Участник
Сообщений: 276
Регистрация: 18.4.2002
Где: Ashdod, Israel

Репутация: 7
Всего: 9



Если в проекте используется MySQL то можно воспользваться его встроенными функциями для работы с датами. Они и очень удобные и довольно шустрые. Я при сложных манипуляциях с датами в основном юзаю их...


--------------------
Best regards!                                                             
@..@_____Ku6ep
=*=______\______KPbIC
Код
print join "",map{chr}(split/(\w{2})/,hex(int(2175.57302796298**2)))
PM WWW ICQ Skype Jabber YIM   Вверх
korob2001
Дата 8.4.2006, 04:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



А вот ручной вариант. Называется "Делать было нечего" ;))))).
Код

#!/usr/bin/perl -w
use strict;

my $first = "25/01/2000";
my $second = "01/03/2000";

print join("\n",dateList($second,$first));

sub dateList {
    my($f,$s) = @_;
    my(@res,@temp) = ();
    push(@temp, [split(/\//, $f)],[split(/\//, $s)]);
    grep {s/^0+//} @$_ for ( @temp );
    ($f,$s) = dateSort(@temp);
    my $days = days_in_month($f->[1],$f->[-1]);
    while (1) {
        last if ($f->[-1] >= $s->[-1]) && ($f->[1] >= $s->[1]) && ($f->[0] > $s->[0]);
        push(@res, join("/", $f->[0] < 10 ? "0" . $f->[0] : $f->[0], $f->[1] < 10 ? "0" . $f->[1] : $f->[1], $f->[-1]));
        if ($f->[0]++ >= $days) {
            $f->[0] = 1;
            if (++$f->[1] > 12) {
                  $f->[1] = 1;
                ++$f->[2];
            }
            $days = days_in_month($f->[1],$f->[-1]);
        }
    }
    return wantarray ? @res : \@res;
}

sub days_in_month {
    if ($_[0] == 2) {
         return ($_[1] % 4) ? 28 : 29;
    } elsif (($_[0] == 4) || ($_[0] == 6) || ($_[0] == 9) || ($_[0] == 11)) {
         return 30;
    } else {
         return 31;
    }
}

sub dateSort { return sort { $a->[-1] <=> $b->[-1] || $a->[1] <=> $b->[1] || $a->[0] <=> $b->[0] } @_ };

Подпрограмма dateList получает две даты в формате dd/mm/yyyy, не важно в каком порядке, можно первой передать и большую дату. Возвращает в списковом контексте список всего диапазона между полученными датами, с ними включительно. В скалярном контексте вернёт ссылку на этот список.
Просто пример, с Time::Local, который я привёл выше, не прокатит для дат, которые меньше 1970 года, т.е. начала *.nix эпохи. ;((( Этот вроде всё правильно показывает, хотя нужно ещё потестить.

Это сообщение отредактировал(а) korob2001 - 8.4.2006, 17:44


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0995 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.