Forum Webscript.Ru

Программирование => Perl => Тема начата: Yaroslav от 21 Апреля 2004, 15:00:39

Название: Увеличение даты
Отправлено: Yaroslav от 21 Апреля 2004, 15:00:39
Подскажите, есть ли какой то другой пуь добавить к localtime(time) определенное количество дней кроме как писать програму с помощью if & else
Название: Увеличение даты
Отправлено: Chs от 21 Апреля 2004, 15:10:30
1. Date::Calc
2. Прибавить к unix-таймстампу количество секунд соответствующее необходимому количеству дней.
Название: Увеличение даты
Отправлено: AliMamed от 21 Апреля 2004, 15:11:16
посчитать количество секунд в количестве дней и прибавить.
Название: Увеличение даты
Отправлено: commander от 21 Апреля 2004, 15:21:19
#!/usr/bin/perl -w
use strict;
use Time::Local;
my $date="2004-03-30";
my ($year, $mon, $day) = split/\\-/, $date;
my $unix_time=timelocal(0, 0, 0, $day, $mon, $year);
$unix_time+=86400;
($day, $mon, $year) = ((localtime($unix_time))[3,4,5]);
$year+=1900;
$date= sprintf("%04d-%02d-%02d", $year, $mon, $day);
print "$date";
Название: Увеличение даты
Отправлено: Yaroslav от 21 Апреля 2004, 16:11:14
Цитировать
Chs:
1. Date::Calc

устрашающее название - описания не нашел, только сам пакет.
Цитировать
Chs:
2. Прибавить к unix-таймстампу количество секунд соответствующее необходимому количеству дней.

можно примерчик?
с таким название как "unix-таймстамп" встречаюсь первый раз
Название: Увеличение даты
Отправлено: Yaroslav от 21 Апреля 2004, 16:14:24
Цитировать
AliMamed:
посчитать количество секунд в количестве дней и прибавить.

это первое что пришло в голову, но в таком случае скрипт получается очень громозкий, так как нужно учитывать не только месяцы, но и высокосный год.
Цитировать
commander:
спасибо за пример, как раз он и страдает всеми перечисленными выше проблемами.
Название: Увеличение даты
Отправлено: commander от 21 Апреля 2004, 16:36:23
Yaroslav
пардон... немного не так... :
#!/usr/bin/perl -w
use strict;
use Time::Local;
my $date="2004-02-29";
my ($year, $mon, $day) = split/\\-/, $date;
$mon-=1;
my $unix_time=timelocal(0, 0, 0, $day, $mon, $year);
$unix_time+=86400; #ïðèáàâëÿåì îäèí äåíü...
($day, $mon, $year) = ((localtime($unix_time))[3,4,5]);
$year+=1900;
$mon+=1;
$date= sprintf("%04d-%02d-%02d", $year, $mon, $day);
print "$date";

на этот пример никаких проверок на високосный год ставить не НАДО!!!
perldoc Time::Local

в следующий раз прежде чем бросаться сорказными словоизлеяниями... вроде этого:
Цитировать
спасибо за пример, как раз он и страдает всеми перечисленными выше проблемами

попробуйте разобраться в ответе... :)
Название: Увеличение даты
Отправлено: NeoNox от 21 Апреля 2004, 16:46:59
Можно и так, но проще всего:
print localtime(time);                #сейчас
print localtime(time+24*60*60);#завтра
print localtime(time+24*60*60*2);    #послезавтра
а дальше делай что хочеш.
Название: Увеличение даты
Отправлено: Yaroslav от 21 Апреля 2004, 16:54:47
Хорошо быть новичком. :)
Искал одно, нашел другое. Посмотрите, как такой вариант?
Я правда с трудом соображаю что он делает, но без 2 и 3 строчки работать не хочет.
use HTTP:: Date;
$string = time2str($time);
$time = str2time($string);
$time1=$time+186400;
$string2 = time2str($time1);
Название: Увеличение даты
Отправлено: Меняздесьдавнонет от 21 Апреля 2004, 16:59:59
этот способ подвержен тем же проблемам, что ты перечислил.
примерный способ тебе сказали.
Для точных тебе привели модуль. Пользуйся им.
Или ты хочешь, чтобы тебе здесь написали код этого модуля со всеми проверками на кол-во дней, високосность и переход на летнее время?
Название: Увеличение даты
Отправлено: NeoNox от 21 Апреля 2004, 17:07:57
[moderator]
Брейк! Все кроме ответов я уберу.
Ругаться и выяснять отношения в приват.
Название: Увеличение даты
Отправлено: NeoNox от 21 Апреля 2004, 17:16:04
Yaroslav
наверняка есть сотня вариантов как добиться того что тебе нужно.
я даже тебе более скажу, большинство модулей для работы со временем работают по одному алгоритму или наследуют модули более высокого уровня. разберись с каждым (я имею ввиду исходный код) из преведенных и ты поймеш как они работают и что ближе всего тебе подходит.
Название: Увеличение даты
Отправлено: Yaroslav от 21 Апреля 2004, 17:21:45
Цитировать
NeoNox:
Можно и так, но проще всего:
print localtime(time); #сейчас
print localtime(time+24*60*60);#завтра
print localtime(time+24*60*60*2); #послезавтра
а дальше делай что хочеш.

Вот огромное спасибо и ненадо придумывать велосыпед :)
я как то не знал что можно добавлять именно к (time).
Название: Увеличение даты
Отправлено: AliMamed от 21 Апреля 2004, 17:57:28
я с вас обалдеваю уважаемая редакция.

дайджест ответов
AliMamed:посчитать количество секунд в количестве дней и прибавить
Yaroslav это первое что пришло в голову, но в таком случае скрипт получается очень громозкий, так как нужно учитывать не только месяцы, но и высокосный год
NeoNox print localtime(time+24*60*60*2); #послезавтра
Yaroslav Вот огромное спасибо

такое ощущение что на разных языках разговариваем
Название: Увеличение даты
Отправлено: Yaroslav от 21 Апреля 2004, 18:13:59
еще такой вопрос. если есть дата к примеру 20-05-2004
можно ли сравнить ее с localtime(time) что б разница выводилась в количистве дней?
или же только грубое и не точное сравнение типа
.....localtime(time);
20+31-$mday;
Название: Увеличение даты
Отправлено: AliMamed от 21 Апреля 2004, 18:16:21
ты понимаешь что такое time?
Название: Увеличение даты
Отправлено: Yaroslav от 21 Апреля 2004, 18:19:35
Цитировать
AliMamed:
AliMamed:посчитать количество секунд в количестве дней и прибавить

повторяюсь, я не знал о том что можно просто добавить количество секунд именно к localtime(time);
кстати в yandex & perldoc я єтого не нашел.
до этого я думал о
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
$lastdata=2*60*60*24;
$sec+$lastdata;
вот и представь куда завели мои мысли... :)
Название: Увеличение даты
Отправлено: Yaroslav от 21 Апреля 2004, 18:20:47
Цитировать
AliMamed:
ты понимаешь что такое time?

может не совсем, обьясни
Название: Увеличение даты
Отправлено: AliMamed от 21 Апреля 2004, 18:23:18
ну и зря не нашел. лучше искать было. ты сейчас просто совершенно не понимаешь что это за функции

Цитировать
localtime -- Converts a time as returned by the time function to a 9-element list with the time analyzed for the local time zone


Цитировать
time -- Returns the number of non-leap seconds since whatever time the system considers to be the epoch (that\'s 00:00:00, January 1, 1904 for Mac OS, and 00:00:00 UTC, January 1, 1970 for most other systems).


если ты внимательно это прочитаешь то вопроса как сравнить и как прибавить относительно переменных с датами у тебя возникать больше не должно
Название: Увеличение даты
Отправлено: NeoNox от 21 Апреля 2004, 18:26:11
А вот с этого места начни изучать модуль предложенный Chs
http://search.cpan.org/~stbey/Date-Calc-5.3/Calc.pod
Название: Увеличение даты
Отправлено: AliMamed от 21 Апреля 2004, 18:29:06
т.е. по русски говоря

time - возвращает количество секунд от начала эпохи числом. именно к этому количеству надо прибавлять/отнимать, именно его надо использовать чтобы сравнивать с другими датами. в базах предпочтительно хранить даты именно в этом формате и лишь для показа пользователю конвертить их в человекопонятную дату.

localtime как раз возвращает тебе список, который позволит тебе сформировать такую человекопонятную дату.
Название: Увеличение даты
Отправлено: NeoNox от 21 Апреля 2004, 18:38:08
Строго говоря localtime в списковом контексте возвращяет список а в скалярном - дату в человекопонятном формате.
Например $loc = (localtime(time+24*60*60))[5]+1900:
вернет "завтрашний" год и так далее..
Название: Увеличение даты
Отправлено: Yaroslav от 21 Апреля 2004, 18:40:43
Цитировать
AliMamed:
time - возвращает количество секунд от начала эпохи числом. именно к этому количеству надо прибавлять/отнимать, именно его надо использовать чтобы сравнивать с другими датами. в базах предпочтительно хранить даты именно в этом формате и лишь для показа пользователю конвертить их в человекопонятную дату.

localtime как раз возвращает тебе список, который позволит тебе сформировать такую человекопонятную дату.

исходя из всего вышесказаного должна работать функция
print localtime(3361730310451201);
но она не работает.. :(
Название: Увеличение даты
Отправлено: Yaroslav от 21 Апреля 2004, 18:53:19
Цитировать
NeoNox:
Строго говоря localtime в списковом контексте возвращяет список а в скалярном - дату в человекопонятном формате.
Например $loc = (localtime(time+24*60*60))[5]+1900:
вернет "завтрашний" год и так далее..

это уже стало понятно еще после первого сообщения как добавить дату, а вот как вывести разницу в днях еще не понятно.
хоть скажите с помощью localtime(time) это возможно сделать или только Date::Calc мне поможет?
Название: Увеличение даты
Отправлено: NeoNox от 21 Апреля 2004, 18:55:34
print time;
> 1082559181
print scalar localtime(1082559181);
> Wed Apr 21 17:53:01 2004


Внимательнее читай каждый пост.
Название: Увеличение даты
Отправлено: NeoNox от 21 Апреля 2004, 19:00:13
Цитировать
Yaroslav:
хоть скажите с помощью localtime(time) это возможно сделать

Запросто.
Береш карандаш в руку и пишеш сначала на бумаге алгоритм.
Потом реализуеш его на Perl/
Вот и все.

Цитировать
Yaroslav:
или только Date::Calc мне поможет?

В этом модуле уже есть все что тебе нужно:
http://search.cpan.org/~stbey/Date-Calc-5.3/Calc.pod#RECIPES
Название: Увеличение даты
Отправлено: NeoNox от 21 Апреля 2004, 19:24:08
Yaroslav кстати прямо для тебя неаписано в факе:
perldoc -q date
Название: Увеличение даты
Отправлено: Yaroslav от 22 Апреля 2004, 11:38:37
Спасибо AliMamed и Огромное спасибо NeoNox
за монотонное обьяснение что формат даті должен хранится в "time". теперь это выглядит так:
(..,..,..,..,$newdata,$lastdata,..)=split(/`/,$file);
$dey=int(($lastdata-$newdata)/24/60/60);
($sec,$min,$hour,$mday,$mon,$year,$wday)=localtime($newdata); $year+=1900; $mon+=1;
($sec,$min,$hour,$mday,$mon,$year,$wday)=localtime($lastdata); $year+=1900; $mon+=1;
Название: Увеличение даты
Отправлено: DamonLSD от 08 Февраля 2009, 20:58:36
Цитировать
Yaroslav:
еще такой вопрос. если есть дата к примеру 20-05-2004
можно ли сравнить ее с localtime(time) что б разница выводилась в количистве дней?

ВСЕМ привет! :)
на днях тоже столкнулся с вычислением разницы двух дат и конечно же хотелось обойтись стандартными модулями. Вот, что у меня получилось ... может кому-то пригодицца
#!D:/www/Perl/bin/perl.exe

print "Content-type: text/html; charset=windows-1251\\n\\n";

use strict;
use Time::Local;

# Текущая дата
my ($sec,$min,$hrn,$day,$mon,$yrn,$wkn,$ydn,$dst) = localtime(time);
  $mon = $mon+1;
  if ($mon < 10) {$mon = "0$mon";}
  if ($day < 10) {$day = "0$day";}
  if ($hrn < 10) {$hrn = "0$hrn";}
  if ($min < 10) {$min = "0$min";}
  if ($sec < 10) {$sec = "0$sec";}
  $yrn = 1900 + $yrn;
  my $date= "$day\\-$mon\\-$yrn";
  my $time= "$hrn\\:$min\\:$sec";

# Начальная дата
my $begDate = "01-01-2009";
# Конечная дата
my $endDate = "01-01-2010";

# Парсим начальную дату на день месяц и год, разделитель "-"
my ($beg1, $beg2, $beg3) = split (/-/,$begDate);
# Парсим конечную дату на день месяц и год, разделитель "-"
my ($end1, $end2, $end3) = split (/-/,$endDate);

# Вычисляем сколько прошло секунд до начальной даты
my $begDateSec = timelocal(0, 0, 0, $beg1, $beg2-1, $beg3);
# Вычисляем сколько прошло секунд до конечной даты
my $endDateSec = timelocal(0, 0, 0, $end1, $end2-1, $end3);

# Вычисляем разницу в секундах от начальной даты до конечной
my $difDateSec = $endDateSec - $begDateSec;
# Вычисляем разницу в сутках от начальной даты до конечной
my $difDateSut = $difDateSec / 86400;

# Вывод результатов
print "Текущая дата: $date $time (" . time . " сек)";
print "

";
print "Начальная дата: $begDate ($begDateSec сек)";
print "
";
print "Конечная дата:  $endDate ($endDateSec сек)";
print "

";
print "Разница: $difDateSut сут ($difDateSec сек)";

Результат
Текущая дата: 08-02-2009 20:56:52 (1234115812 сек)

Начальная дата: 01-01-2009 (1230757200 сек)
Конечная дата: 01-01-2010 (1262293200 сек)

Разница: 365 сут (31536000 сек)