За последние 24 часа нас посетили 15740 программистов и 1666 роботов. Сейчас ищут 835 программистов ...

Работа с датой

Тема в разделе "PHP для новичков", создана пользователем VLK, 13 мар 2014.

  1. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Я добавляю запись в БД, в том числе дату ( date("Y-m-d") ) мне надо к этой дате прибавить допустим 100 дней (суток) и получить дату в том же формате

    как это правильно сделать и как правильно сравнивать дату (в частности больше меньше)?

    короче цель, я в БД добавляю 2 даты, одна дата создания записи, вторая дата удаления записи, а потом при посещении кем-нибудь данной записи происходит сравнение текущей даты со второй датой (датой удаления), если они совпадают или вторая больше первой, запись удаляется.
     
  2. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Добавить сто дней:
    Код (PHP):
    1. <?php
    2. $date = date('Y-m-d', time() + 100 * 86400);
    3.  
    Сравнивать даты в таком формате можно с помощью строковых функций

    Добавлено спустя 1 минуту 21 секунду:
    Если к уже существующей дате надо прибавить сто дней:
    Код (PHP):
    1. <?php $date = date('Y-m-d', strtotime('2010-01-20') + 100 * 86400);
    Добавлено спустя 1 минуту 37 секунд:Если к данным в mysql:
    Код (Text):
    1. mysql> SELECT '2005-01-01' - INTERVAL 1 SECOND;
    2.         -> '2004-12-31 23:59:59'
     
  3. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. strtotime('+100 days'); 
     
  4. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    вы имеете ввиду
    Код (Text):
    1. $cd = date("Y-m-d");
    2. $dd = date("Y-m-d", strtotime($cd . ' +100 day')) ;
    ?
     
  5. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Не устраивает?)))
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    VLK, тебе topas самое верное подсказывает. Ты не пропустил случайно?
    Если ты говоришь про базу, то и смотри операции для родного майсиквельного типа DATETIME. Можно применять + / - INTERVAL. Или то же самое через DATE_ADD() / DATE_SUB() — дело вкуса.
    Есть 100500 полезных функций на стороне БД. Естественно две даты можно сравнивать на равенство или больше-меньше.

    Read the fucked manual.
     
  7. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    artoodetoo,VLK, Самое правильное хранить их в time() и сравнивать.
    strtotime и нужен, чтобы не страдать.
    Читайте, про "Форматы отношений".
     
  8. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    не в этом дело, не хочу показаться невежливым, но вы всегда даете такие ответ, после которых остаётся еще больше вопросов.

    нет, не пропустил, но чем будет хуже такая запись (просто она для меня более понятная):
    Код (Text):
    1. $cd = date("Y-m-d");
    2. $dd = date("Y-m-d", strtotime($cd . ' +100 day')) ;
    Я как собираюсь делать, человек заходит на страницу с соответствующий записью (index.php?id=122), из БД я получаю данные (на запись с ID 122), в том числе дату удаления и сравниваю ее с текущей датой, если она меньше то происходит удаление записи из БД, а пользователю показывает что нет такой страницы, сравнение происходит так:

    Код (Text):
    1. // $dd - дата удаление из БД, в формате ("Y-m-d"
    2. if ( $dd <  date("Y-m-d") ) { /* тут происходит удаление страницы */ }
    пойдет так?
     
  9. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Код (PHP):
    1. <?php
    2. if ($dd > date('Y-m-d', strtotime('-100 day')) { /* .... */ }
    Добавлено спустя 3 минуты 13 секунд:
    В чём преимущество: не требуется скармливать в функцию strtotime строку '2010-02-05 00:00:00 + 100 day'.

    Я уверен, что это будет работать, но считаю что не стоит заниматься парсингом такой строки, т.к. её поведение будет зависеть от данных в бд.
    Но это так, вопрос религии.
     
  10. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Подскажите, а как вычитать дату, т.е. есть 2 даты надо получить их разницу между ними в днях т.е.:

    Код (Text):
    1. $cd = date( 'Y-m-d' );
    2. $dd = date( 'Y-m-d', strtotime($dd . ' +100 day') );
    как вычесть $dd из $cd и получить результат только в цифрах т.е. 100
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    понятно почему ты ничего не понял :) ты не в курсе про типы данных. родной для PHP способ представления даты и времени — целое число, т.н. unix timestamp. именно в таком виде выдает время функции time() или filemtime(). оно измеряется в секундах. seconds since the Unix Epoch (January 1 1970 00:00:00 GMT).
    причем это время по гринвичу. когда это время преобразуется в строку, учитываются настройки time zone.

    $d + 60 это время на 1 минуту после времени $d.
    $d + (60*60*24) это время на сутки после времени $d
    $d2 - $d1 это разница в секундах между двумя отметками даты-времени

    date() преобразует числовое значение времени в строку. результат уже не дата! формат неудобный для вычислений.
    strtotime() делает обратное преобразование из строки в дату, при этом умеет вносить поправки — это конечно здорово, но очень неэффективно. потому что к настоящей дате можно было бы просто прибавить/отнять число секунд безо всякой магии.

    читай блин справки по функциям.

    используй дла этого даты, а не строки

    Добавлено спустя 3 минуты 9 секунд:
    p.s. есть еще объектные типы для работы с датой-временем: DateTime, DateTimeZone и DateInterval. но о них читай когда с простыми типами разберешся.
     
  12. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Спасибо artoodetoo, не первый раз помогаете / объясняете, причем довольно доходчиво.

    Вот как я поступаю:
    Код (Text):
    1. // две даты, дата создания записи и дата ее удаления
    2. $cd = date("Y-m-d");
    3. $dd = date("Y-m-d", strtotime($cd . ' +132 day')) ;
    4.  
    5. // я перевожу их в числа
    6. $new_cd = strtotime($cd);
    7. $new_dd = strtotime($dd);
    8.  
    9. // 86400 - в секундах это сутки
    10. $day = ($new_dd - $new_cd) / 86400 ;
    11.  
    12. echo $day; // результат 132
     
  13. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    всё верно. только замечу, что вот здесь
    Код (PHP):
    1. $day = ($new_dd - $new_cd) / 86400 ; 
    может получиться дробное значение. поэтому если нужны целые дни, можно округлить результат через floor() или round().