В секунды (функция PHP)
12.03.2011 технологии
Традиционно в программировании везде используются секунды. Но так уж вышло, что человекам (даже программистам) иногда удобнее оперировать минутами или часами (например назначая время жизни кэша). Потому может кому и пригодится простенькая функция to_sec().
Кстати, предложите более красивый алгоритм. Мне мой чем-то не нравится. Наверно потому что preg_replace() вызывается в любом случе, даже если число изначально задаётся в секундах.
Комментарии
Комментирование этой статьи закрыто.
ИМХО, это извращение, лишний код для решения несуществующей по сути проблемы и все такое=)
Минуты/часы в программировании у всех ассоциируются с 60 и 3600 (или 60*60), мне во всяком случае всегда так казалось.
В общем-то да, это так, незначительная мелочь :) Я без претензий особых написал, просто вдруг кому понадобиться и для маленькой разминки мозга. Давно что-то не программировал, постепенно вливаюсь снова.
Согласен, для разминки такие примерчики идеально подходят. Сам этот код себе сейчас скопипастил, запустил, хотел подумать, как переписать, но впал в ступор и забил) Не кодил месяц-два, как же быстро мозги ссыхаются=)
Мда… Разве что для интерфейса, если заставить юзера самого вводить время. Но в любом случае именно в программировании мне как-то привычней использовать 60*60*24*30*12*….
Брр. Коробит от арифметических операций каждый раз в коде только из-за лени один раз посчитать.
Хм… Мне наоборот приятней видеть, скажем, 60*60*24, а не 86400. 86400 это 86400, а 60*60*24 – это количество секунд в сутках, спутать, что обозначают эти цифры, будет в разы труднее даже по прошествии времени.
Где-то читал, что цифры в коде должны быть либо явные (уже упомянутые 60, 3600, число пи и т.д.), либо объявлены константами в самом начале, чтобы непонятные цифры по ходу кода не встречались (то же касается и не всем известных констант).
Ну а 5m ещё лучше чем 5*60, не находишь?
В качестве string при выводе может быть и да, но отдавать парсеру string, чтобы он ее как-то хитро привел к int и что-то на что-то перемножил, как-то не хочется=) Я параноик в этом плане, считаю, что все должно быть явно и чем прозрачней и проще для понимания, тем лучше.
Хм.. А что, strtotime(); отменили? :)
конечно задача надумана но добавляет этой как ее, ну этой, вы поняли… тоесть писать 60*60* конечно тоже можно, но 3m как-то лаконичней
Max, strtotime() клёвая функция, но причём здесь она? Речь о длительности времени, а не о конкретном времени вообще. Но вообще это от реализации зависит, конечно. С тем же сроком жизни кэша можно было бы делать что-то вроде strtotime('+1 day').
Немного оффтопа. А как посмотреть внутренности какой-нибудь стандартной функции. Иногда хочется, а не знаю как. Печалька =(
http://ru.php.net/get/php-5.3.5.tar.gz/from/a/mirror
бомж, да, спасибо, что-то я туплю, исходники же открыты.
Нет :) Это сейчас кажется разумным. А через полгода, когда в каком-то из скриптов юзающих эту функцию обнаружится какой-то косяк, и надо будет разбираться где и какой, то эти «5m» могут быть приняты и за 5month, например.
Аналогично.
Там кагбэ не надо считать ничего :) И так же понятно, что это означает.
Ты не понял. Вместо того, чтобы один раз поставить правильное значение жёстко, скрипт тысячи и сотни тысяч раз считает зачем-то это значение. Глупо как-то. Впрочем, мой вариант с этой точки зрения такой же глупый :)
Если число часто используется, то как вариант заюзать константу в начале кода с понятным комментарием.
define(‘SEC_IN_DAY’, ‘86400’); //86400 = 60*60*24
Ну или если нужное число используется не повсеместно в коде, а только в каком-то цикле, то объявить не константой, а переменной до требуемого участка кода. Это вроде обязательная практика, любые одинаковые вычисления в цикле выносить за цикл и считать только один раз.
echo strtotime("+1 hour", 0);
Но, действительно, эта функция полезна только для отметки даты истечения кеша. Простое умножение будет быстрее и понятнее (если поставить рядом комментарий =60*60;//1h)
Твоя штука (за вычетом того, что ничем не удобнее умножения, которое, кстати, умным интерпретатором не будет считаться, и констант, которые избавят тебя от магических цифр в коде и упростят управление), не учитывает, например, констуркции 1h23m35s – понятно, что это обычно и не надо, но раз используешь preg_match – почему бы сразу и не ввести (\d+)?
Да и в твоем случае достаточно if(trim($time, ‘h’)!=$time) $time = intval($time)*60*60; без массивов и регулярок (и аналогично, для минут). Да и с моим сработает – если начать с секунд, которые в конце пишутся.
И, ради бога, назови функцию нормально – «strtimeInSec» хотя бы.
Хм, что-то у меня много интонационных оборотов. Надо пойти поспать.
Имхо, удобней 60 * 60 * 24 и т.д.
Все равно не пойму. Окей, делаете 60*5=300 получаете 300 секунд. И что? Кэш? Все равно надо получать текущее время, и выставлять время когда он заэкспайрится. Дополнительные операции. Не кэш – точно так же, надо делать привязку к реальному времени. Один черт надо делать какие-то операции с текущим временем. Даже сутки, 86400, если их отмерять – все равно будешь делать time()+86400.
Не проще ли сделать strtotime(’+1 day’); ? :) Хотя, конечно, в качестве оптимизации кода – я бы оставлял time()+86400. Нет смысла делать кучу дополнительных арифметических операций, либо разбор строки и конверт ко времени.
Далее, Тормоз, опять же. Если тебе надо получить цифру 300, то, зачем изобретать очередной велосипед? :)) Правильно, strtotime! echo strtotime(‘5min’,0); – правильно, вернет 300! :)
А уж привлекать регулярки для такой тривиальной задачи… Каждый пишет по своему кривой код. ;)
Max, я согласен с твоими доводами, спасибо.