За последние 24 часа нас посетили 24687 программистов и 1695 роботов. Сейчас ищет 881 программист ...

перевод времени, переломный день

Тема в разделе "PHP для новичков", создана пользователем rewuxiin, 11 окт 2017.

  1. rewuxiin

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

    С нами с:
    17 апр 2012
    Сообщения:
    611
    Симпатии:
    87
    на сайте происходит забавная штука. время везде хранится и создается в utc, однако 29 числа происходит хренотень

    периодически оказываю поддержку проекту по бронированию квестов - на сайте есть список дней в котором выводится время для бронирования по дням, время в данном случае у всех дней одинаковое
    итак - отображаемое на сайте время все верное
    возьмем к примеру время 12.45
    28 числа это 45900 + 1509141600 - бронирование происходит верно.
    29 числа это 45900 + 1509228000 - при бронировании время брони создается на час назад
    30 число это 45900 + 1509318000 - бронирования происходит верно
    все остальные дни тоже верно
    временная зона стоит Europe/Madrid

    ajax-ом отправляю данные формы (время и дату) и в php уже создаю время для проверки
    проверяю так
    PHP:
    1. $iDate = F::GetRequestStr('time') + F::GetRequestStr('date');
    2. return date('d-m-Y H:i, $iDate);
    получаю 11.45

    попробовал вот так
    PHP:
    1. $iDate = new DateTime();
    2. $iDate->setTimestamp(F::GetRequestStr('time') + F::GetRequestStr('date'));
    3. return $iDate->format('d-m-Y H:i');
    получаю 11.45
    и дополнительно на всякий случай устанавливал setTimezone('Europe/Madrid')

    и все-равно каждый раз 29 числа я получаю 11.45

    где же копать?
     
  2. Griffter

    Griffter Новичок

    С нами с:
    27 сен 2017
    Сообщения:
    92
    Симпатии:
    25
    Всё правильно. Слышали о переводе времени? Так вот часовой пояс: Europe/Madrid в воскресенье 29 октябрь 2017 в 03:00 утра переводит время на зимнее, то есть на 1 час назад.
     
  3. rewuxiin

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

    С нами с:
    17 апр 2012
    Сообщения:
    611
    Симпатии:
    87
    так а мне шо делать? это же херотень какая-то получается, два раза в год.
     
  4. Griffter

    Griffter Новичок

    С нами с:
    27 сен 2017
    Сообщения:
    92
    Симпатии:
    25
    Я с этим не сталкивался, если честно.
    Знаю только, что если складывать даты как строки, то должно работать. Примерно так:
    PHP:
    1. $date = date('d-m-Y H:i', 1509228000);
    2. $timestamp = strtotime("$date + 12 hours 45 minutes");
    3. echo date('d-m-Y H:i', $timestamp);
    Может получится дальше мысль развить.
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Проблема в том, что вы записывается (вероятно) время не в UTC, а местное время в поле, для которого установлено UTC. То есть когда клиент бронирует на 13 часов по Мадриду, вы пишите в базу - 13 часов. А следует конвертировать эти 13 часов в UTC, т.е. в летний период в БД записывать 14 часов.
    --- Добавлено ---
    --- Добавлено ---
    https://www.opennet.ru/tips/1810_timezone_date_time.shtml
     
    rewuxiin нравится это.
  6. rewuxiin

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

    С нами с:
    17 апр 2012
    Сообщения:
    611
    Симпатии:
    87
    [vs], так я даже еще не пишу в базу, это я из формы получил данные даты и времени и сложил.
     
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    @rewuxiin если у тебя еще нет реализации, то я рекомендую тебе хранить время в unix timestamp, а получать его с помощью функции mktime() по данным из формы. Эта функция опирается default_timezone в твоём php. Если ты будешь получать timestamp в ней, а вывод на экран форматировать с помощью date(), то не будет никаких проблем.
     
  8. rewuxiin

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

    С нами с:
    17 апр 2012
    Сообщения:
    611
    Симпатии:
    87
    [vs], я алень, я не правильно описал, оно у меня и хранится все в timestamp. и как видно из примера - приходит из формы тоже в timestamp
    Но при вызове date или DateTime - выходит вот эта херотень.
    а вот это да, возможно поможет. нужно подумать.