В секунды (функция PHP)

12.03.2011

Традиционно в программировании везде используются секунды. Но так уж вышло, что человекам (даже программистам) иногда удобнее оперировать минутами или часами (например назначая время жизни кэша). Потому может кому и пригодится простенькая функция to_sec().

Кстати, предложите более красивый алгоритм. Мне мой чем-то не нравится. Наверно потому что preg_replace() вызывается в любом случе, даже если число изначально задаётся в секундах.

Комментарии

  1. # tulvit

    ИМХО, это извращение, лишний код для решения несуществующей по сути проблемы и все такое=)

    иногда удобнее оперировать минутами или часами

    Минуты/часы в программировании у всех ассоциируются с 60 и 3600 (или 60*60), мне во всяком случае всегда так казалось.

  2. # Тормоз

    В общем-то да, это так, незначительная мелочь :) Я без претензий особых написал, просто вдруг кому понадобиться и для маленькой разминки мозга. Давно что-то не программировал, постепенно вливаюсь снова.

  3. # tulvit

    Согласен, для разминки такие примерчики идеально подходят. Сам этот код себе сейчас скопипастил, запустил, хотел подумать, как переписать, но впал в ступор и забил) Не кодил месяц-два, как же быстро мозги ссыхаются=)

  4. # Kichrum

    Мда… Разве что для интерфейса, если заставить юзера самого вводить время. Но в любом случае именно в программировании мне как-то привычней использовать 60*60*24*30*12*….

  5. # Тормоз

    Брр. Коробит от арифметических операций каждый раз в коде только из-за лени один раз посчитать.

  6. # tulvit

    Хм… Мне наоборот приятней видеть, скажем, 60*60*24, а не 86400. 86400 это 86400, а 60*60*24 – это количество секунд в сутках, спутать, что обозначают эти цифры, будет в разы труднее даже по прошествии времени.

  7. # tulvit

    Где-то читал, что цифры в коде должны быть либо явные (уже упомянутые 60, 3600, число пи и т.д.), либо объявлены константами в самом начале, чтобы непонятные цифры по ходу кода не встречались (то же касается и не всем известных констант).

  8. # Тормоз

    Хм… Мне наоборот приятней видеть, скажем, 60*60*24, а не 86400. 86400 это 86400, а 60*60*24 – это количество секунд в сутках, спутать, что обозначают эти цифры, будет в разы труднее даже по прошествии времени.

    Ну а 5m ещё лучше чем 5*60, не находишь?

  9. # tulvit

    В качестве string при выводе может быть и да, но отдавать парсеру string, чтобы он ее как-то хитро привел к int и что-то на что-то перемножил, как-то не хочется=) Я параноик в этом плане, считаю, что все должно быть явно и чем прозрачней и проще для понимания, тем лучше.

  10. # Max: 

    Хм.. А что, strtotime(); отменили? :)

  11. # Миша: 

    конечно задача надумана но добавляет этой как ее, ну этой, вы поняли… тоесть писать 60*60* конечно тоже можно, но 3m как-то лаконичней

  12. # Тормоз

    Max, strtotime() клёвая функция, но причём здесь она? Речь о длительности времени, а не о конкретном времени вообще. Но вообще это от реализации зависит, конечно. С тем же сроком жизни кэша можно было бы делать что-то вроде strtotime('+1 day').

  13. # tulvit

    Немного оффтопа. А как посмотреть внутренности какой-нибудь стандартной функции. Иногда хочется, а не знаю как. Печалька =(

  14. # бомж

    http://ru.php.net/get/php-5.3.5.tar.gz/from/a/mirror

  15. # tulvit

    бомж, да, спасибо, что-то я туплю, исходники же открыты.

  16. # DimaX

    Тормоз: Ну а 5m ещё лучше чем 5*60, не находишь?

    Нет :) Это сейчас кажется разумным. А через полгода, когда в каком-то из скриптов юзающих эту функцию обнаружится какой-то косяк, и надо будет разбираться где и какой, то эти «5m» могут быть приняты и за 5month, например.

    tulvit: Хм… Мне наоборот приятней видеть, скажем, 60*60*24, а не 86400. 86400 это 86400, а 60*60*24 – это количество секунд в сутках, спутать, что обозначают эти цифры, будет в разы труднее даже по прошествии времени.

    Аналогично.

    Тормоз: Брр. Коробит от арифметических операций каждый раз в коде только из-за лени один раз посчитать.

    Там кагбэ не надо считать ничего :) И так же понятно, что это означает.

  17. # Тормоз

    Ты не понял. Вместо того, чтобы один раз поставить правильное значение жёстко, скрипт тысячи и сотни тысяч раз считает зачем-то это значение. Глупо как-то. Впрочем, мой вариант с этой точки зрения такой же глупый :)

  18. # tulvit

    Если число часто используется, то как вариант заюзать константу в начале кода с понятным комментарием.

    define(‘SEC_IN_DAY’, ‘86400’); //86400 = 60*60*24

    Ну или если нужное число используется не повсеместно в коде, а только в каком-то цикле, то объявить не константой, а переменной до требуемого участка кода. Это вроде обязательная практика, любые одинаковые вычисления в цикле выносить за цикл и считать только один раз.

  19. # mr

    echo strtotime("+1 hour", 0);

    Но, действительно, эта функция полезна только для отметки даты истечения кеша. Простое умножение будет быстрее и понятнее (если поставить рядом комментарий =60*60;//1h)

  20. # Сергей М.

    Твоя штука (за вычетом того, что ничем не удобнее умножения, которое, кстати, умным интерпретатором не будет считаться, и констант, которые избавят тебя от магических цифр в коде и упростят управление), не учитывает, например, констуркции 1h23m35s – понятно, что это обычно и не надо, но раз используешь preg_match – почему бы сразу и не ввести (\d+)?

    Да и в твоем случае достаточно if(trim($time, ‘h’)!=$time) $time = intval($time)*60*60; без массивов и регулярок (и аналогично, для минут). Да и с моим сработает – если начать с секунд, которые в конце пишутся.

    И, ради бога, назови функцию нормально – «strtimeInSec» хотя бы.

  21. # Сергей М.

    Хм, что-то у меня много интонационных оборотов. Надо пойти поспать.

  22. # Never Lex

    Имхо, удобней 60 * 60 * 24 и т.д.

  23. # Max: 

    Все равно не пойму. Окей, делаете 60*5=300 получаете 300 секунд. И что? Кэш? Все равно надо получать текущее время, и выставлять время когда он заэкспайрится. Дополнительные операции. Не кэш – точно так же, надо делать привязку к реальному времени. Один черт надо делать какие-то операции с текущим временем. Даже сутки, 86400, если их отмерять – все равно будешь делать time()+86400.
    Не проще ли сделать strtotime(’+1 day’); ? :) Хотя, конечно, в качестве оптимизации кода – я бы оставлял time()+86400. Нет смысла делать кучу дополнительных арифметических операций, либо разбор строки и конверт ко времени.

    Далее, Тормоз, опять же. Если тебе надо получить цифру 300, то, зачем изобретать очередной велосипед? :)) Правильно, strtotime! echo strtotime(‘5min’,0); – правильно, вернет 300! :)

    А уж привлекать регулярки для такой тривиальной задачи… Каждый пишет по своему кривой код. ;)

  24. # Тормоз

    Max, я согласен с твоими доводами, спасибо.

Комментирование этой статьи закрыто.

Интересное Покупки ТехникаРазное Отдых Статьи Строительство Услуги Общество Хобби Культура Советы Уют