За последние 24 часа нас посетили 114898 программистов и 5621 робот. Сейчас ищут 1776 программистов ...

Интервал для дат (PHP vs MySQL)

Тема в разделе "PHP для профи", создана пользователем Chushkin, 31 янв 2019.

  1. Chushkin

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

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Есть проблема...
    Например:
    В PHP:
    $time = strtotime('2019-01-31 00:00:00');
    strtotime('1 month', $time)
    вернёт дату '2019-03-03' (т.е. 3-ье марта, время не важно в данном случае).
    В MySQL:
    select '2019-01-31' + interval 1 month
    вернёт дату '2019-02-28'

    Всегда считал, что MySQL-шный правильный. А вот сейчас что-то задумался, - может я был не прав.
    Какой же вариант всё-таки правильный?
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.834
    Симпатии:
    1.335
    Адрес:
    Лень
    а с временной меткой +3 как повлияет ?
     
  3. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @MouseZver, тут ведь не три часа.
    @Chushkin, такая вот особенность php в совокупности с февралём.
    Подробнее: Как на PHP корректно прибавить месяц к дате
    --- Добавлено ---
    А "правильность" определяется в ТЗ.
    Где-то при добавлении месяца к 30 января должно получиться 1 марта, а где-то - 28 или 29 февраля...
     
  4. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.125
    Симпатии:
    1.222
    Адрес:
    там-сям
    @Chushkin правильность зависит от конкретных требований. Чисто субъективно мне вариант MySql нравится больше.
    Такие особенности придется помнить, чтобы не наступить на грабли.

    Надо бы составить таблицу MySql + strtotime + DateTime::add
     
  5. Chushkin

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

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Для справки (кто не знает): у DateTime есть метод modify(), - работает также, как strtotime(). Т.е. с тем же глюком, если это глюк.
     
  6. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Вы то сами чего ожидали? 31 февраля?
    Это машина и она прибавляет не месяц, а количество дней, которое в исходном месяце. Никакого глюка тут нет. Понятие "месяц" неоднозначное.
    PHP:
    1. $date->modify('first day of')->modify('+1 month')->modify('last day of');
    еще можно так (кроссмесячно):
    PHP:
    1. $date->modify('+3 day')->modify('+1 month')->modify('-3 day');
     
    #6 Maputo, 5 фев 2019
    Последнее редактирование: 5 фев 2019