Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP и время

PHP и время

Алексей Васильченко
MobiDev Meetup, Kharkiv, Ukraine http://meetup.mobidev.com.ua/

Avatar for MobiDev Meetup

MobiDev Meetup

May 17, 2017

More Decks by MobiDev Meetup

Other Decks in Programming

Transcript

  1. Костыли астрономического масштаба 1. Юлианский календарь (старый стиль) - 365

    суток 2. Григорианский календарь - 365,2425 суток 3. Секунда координации - 23:59:59 -> 23:59:60 или 23:59:58 -> 00:00:00 (хотя такого еще ни разу не делали) А что такое секунда: 9 192 631 770 периодов излучения, соответствующего переходу между двумя сверхтонкими уровнями основного состояния атома цезия-133 - хоть тут какое-то постоянство!
  2. UTC versus GMT UTC (Coordinated Universal Time) - стандарт гражданского

    времени GMT (Greenwich Mean Time) - таймзона по Гринвичу без учета летнего времени DST (Daylight Saving Time) - практика перехода на летнее время PT, PST, PDT и ET, EST, EDT - таймзоны на западном и восточном побережьях Америки.
  3. Серверное время и NTP sudo apt-get install ntp sudo nano

    /etc/ntp.conf server 0.ubuntu.pool.ntp.org server 1.ubuntu.pool.ntp.org server 2.ubuntu.pool.ntp.org server 3.ubuntu.pool.ntp.org sudo service ntp restart
  4. Unix Timestamp 00:00:00 UTC 1 января 1970 года -> 0

    Вызываем в php: Великий int 32 апокалипсис: допустимые значения с 13 декабря 1901 года 20:45:52 до вторника 19 января 2038 года 03:14:07
  5. Задачи со временем в типичной “соцсети” Отображаем время создания постов

    Отображаем “пост был создан 5 мин назад” Отображаем время ивентов в определенной локации
  6. Задачи со временем в “бухгалтерской системе” Храним время продажи и

    таймзону магазина Налоговым службам неинтересно, запрашивает ли юзер отчет из Нью Йорка или Сан Франциско Считаем сводные отчеты по магазинам в их локальном времени
  7. События с датой без времени Пример: день рождения юзера или

    дата старта контракта Не стоит использовать те же преобразования, чтобы не сдвинуть день рождения Стоит хранить такие даты в другом формате
  8. Интервалы времени и баги летнего времени Создаем отчет о продажах

    за полгода В период отчета был переход на летнее время Нужно делать разную сдвижку до и после перехода
  9. Оффлайн мод на клиенте и валидация времени Не доверяем времени

    с клиента Всегда храним время синхронизации на сервер Отслеживаем уход в будущее и в “невалидное” прошлое
  10. Тестируем время Заворачиваем работу со временем в абстракцию Делаем метод

    “now()”, который можно переопределить в наследнике Пишем тесты, в тестовом режиме “останавливаем” время и работаем с фикстурами
  11. Выводы Достоверная валидации времени может быть только на сервере Используем

    NTP Храним время в UTC и храним имя таймзоны Выясняем текущую задачу и не сводим все к одному подходу - бывают разные случаи Не преобразуем по таймзоне даты без времени Храним таймстампы всех важных событий на сервере