Forum Webscript.Ru
Программирование => Perl => Тема начата: Yaroslav от 21 Апреля 2004, 15:00:39
-
Подскажите, есть ли какой то другой пуь добавить к localtime(time) определенное количество дней кроме как писать програму с помощью if & else
-
1. Date::Calc
2. Прибавить к unix-таймстампу количество секунд соответствующее необходимому количеству дней.
-
посчитать количество секунд в количестве дней и прибавить.
-
#!/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";
-
Chs:
1. Date::Calc
устрашающее название - описания не нашел, только сам пакет.
Chs:
2. Прибавить к unix-таймстампу количество секунд соответствующее необходимому количеству дней.
можно примерчик?
с таким название как "unix-таймстамп" встречаюсь первый раз
-
AliMamed:
посчитать количество секунд в количестве дней и прибавить.
это первое что пришло в голову, но в таком случае скрипт получается очень громозкий, так как нужно учитывать не только месяцы, но и высокосный год.
commander:
спасибо за пример, как раз он и страдает всеми перечисленными выше проблемами.
-
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
в следующий раз прежде чем бросаться сорказными словоизлеяниями... вроде этого:
спасибо за пример, как раз он и страдает всеми перечисленными выше проблемами
попробуйте разобраться в ответе... :)
-
Можно и так, но проще всего:
print localtime(time); #сейчас
print localtime(time+24*60*60);#завтра
print localtime(time+24*60*60*2); #послезавтра
а дальше делай что хочеш.
-
Хорошо быть новичком. :)
Искал одно, нашел другое. Посмотрите, как такой вариант?
Я правда с трудом соображаю что он делает, но без 2 и 3 строчки работать не хочет.
use HTTP:: Date;
$string = time2str($time);
$time = str2time($string);
$time1=$time+186400;
$string2 = time2str($time1);
-
этот способ подвержен тем же проблемам, что ты перечислил.
примерный способ тебе сказали.
Для точных тебе привели модуль. Пользуйся им.
Или ты хочешь, чтобы тебе здесь написали код этого модуля со всеми проверками на кол-во дней, високосность и переход на летнее время?
-
[moderator]
Брейк! Все кроме ответов я уберу.
Ругаться и выяснять отношения в приват.
-
Yaroslav
наверняка есть сотня вариантов как добиться того что тебе нужно.
я даже тебе более скажу, большинство модулей для работы со временем работают по одному алгоритму или наследуют модули более высокого уровня. разберись с каждым (я имею ввиду исходный код) из преведенных и ты поймеш как они работают и что ближе всего тебе подходит.
-
NeoNox:
Можно и так, но проще всего:
print localtime(time); #сейчас
print localtime(time+24*60*60);#завтра
print localtime(time+24*60*60*2); #послезавтра
а дальше делай что хочеш.
Вот огромное спасибо и ненадо придумывать велосыпед :)
я как то не знал что можно добавлять именно к (time).
-
я с вас обалдеваю уважаемая редакция.
дайджест ответов
AliMamed:посчитать количество секунд в количестве дней и прибавить
Yaroslav это первое что пришло в голову, но в таком случае скрипт получается очень громозкий, так как нужно учитывать не только месяцы, но и высокосный год
NeoNox print localtime(time+24*60*60*2); #послезавтра
Yaroslav Вот огромное спасибо
такое ощущение что на разных языках разговариваем
-
еще такой вопрос. если есть дата к примеру 20-05-2004
можно ли сравнить ее с localtime(time) что б разница выводилась в количистве дней?
или же только грубое и не точное сравнение типа
.....localtime(time);
20+31-$mday;
-
ты понимаешь что такое time?
-
AliMamed:
AliMamed:посчитать количество секунд в количестве дней и прибавить
повторяюсь, я не знал о том что можно просто добавить количество секунд именно к localtime(time);
кстати в yandex & perldoc я єтого не нашел.
до этого я думал о
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
$lastdata=2*60*60*24;
$sec+$lastdata;
вот и представь куда завели мои мысли... :)
-
AliMamed:
ты понимаешь что такое time?
может не совсем, обьясни
-
ну и зря не нашел. лучше искать было. ты сейчас просто совершенно не понимаешь что это за функции
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).
если ты внимательно это прочитаешь то вопроса как сравнить и как прибавить относительно переменных с датами у тебя возникать больше не должно
-
А вот с этого места начни изучать модуль предложенный Chs
http://search.cpan.org/~stbey/Date-Calc-5.3/Calc.pod
-
т.е. по русски говоря
time - возвращает количество секунд от начала эпохи числом. именно к этому количеству надо прибавлять/отнимать, именно его надо использовать чтобы сравнивать с другими датами. в базах предпочтительно хранить даты именно в этом формате и лишь для показа пользователю конвертить их в человекопонятную дату.
localtime как раз возвращает тебе список, который позволит тебе сформировать такую человекопонятную дату.
-
Строго говоря localtime в списковом контексте возвращяет список а в скалярном - дату в человекопонятном формате.
Например $loc = (localtime(time+24*60*60))[5]+1900:
вернет "завтрашний" год и так далее..
-
AliMamed:
time - возвращает количество секунд от начала эпохи числом. именно к этому количеству надо прибавлять/отнимать, именно его надо использовать чтобы сравнивать с другими датами. в базах предпочтительно хранить даты именно в этом формате и лишь для показа пользователю конвертить их в человекопонятную дату.
localtime как раз возвращает тебе список, который позволит тебе сформировать такую человекопонятную дату.
исходя из всего вышесказаного должна работать функция
print localtime(3361730310451201);
но она не работает.. :(
-
NeoNox:
Строго говоря localtime в списковом контексте возвращяет список а в скалярном - дату в человекопонятном формате.
Например $loc = (localtime(time+24*60*60))[5]+1900:
вернет "завтрашний" год и так далее..
это уже стало понятно еще после первого сообщения как добавить дату, а вот как вывести разницу в днях еще не понятно.
хоть скажите с помощью localtime(time) это возможно сделать или только Date::Calc мне поможет?
-
print time;
> 1082559181
print scalar localtime(1082559181);
> Wed Apr 21 17:53:01 2004
Внимательнее читай каждый пост.
-
Yaroslav:
хоть скажите с помощью localtime(time) это возможно сделать
Запросто.
Береш карандаш в руку и пишеш сначала на бумаге алгоритм.
Потом реализуеш его на Perl/
Вот и все.
Yaroslav:
или только Date::Calc мне поможет?
В этом модуле уже есть все что тебе нужно:
http://search.cpan.org/~stbey/Date-Calc-5.3/Calc.pod#RECIPES
-
Yaroslav кстати прямо для тебя неаписано в факе:
perldoc -q date
-
Спасибо 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;
-
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 сек)