Вы когда-нибудь задумывались о том, как хранится в компьютере время? Включение и выключение компьютера никак не влияет на часы. Можно сделать вывод, что часы в компьютере работают сами по себе.
Это действительно так. Основные часы компьютера — аппаратные, они живут самостоятельной жизнью и имеют свою собственную батарею. При включении компьютер считывает данные этих часов, записывает к себе в память и начинает самостоятельно отсчитывать время. Эти часы называются системными. Любое изменение системных часов влияет и на аппаратные.
В большинстве операционных систем (Linux, Unix, MacOS) системное время представляется в формате Unix time. Оно определяется как количество секунд, прошедших с полуночи (00:00:00 UTC) 1 января 1970 года (четверг). Время с этого момента называют «эрой Unix» (Unix Epoch). Unix-время представлено целым числом, которое увеличивается с каждой прошедшей секундой без необходимости вычислений для определения года, месяца, дня, часа или минуты для удобства восприятия человеком.
Конкретная дата в формате Unix time называется timestamp (временной штамп). Например, для получения текущего timestamp в PHP используется функция time()
.
<?php
time(); // 1532435204
Одна из главных функций по работе с датами в PHP — date(). Она конвертирует timestamp в человекочитаемый формат. Первым параметром в эту функцию передается описание формата даты, которое устроено по похожему принципу как и форматы для функции sprintf().
<?php
// Y означает год
date('Y'); // 2018
date()
по умолчанию использует текущее время. Но если нужно, ей можно передать конкретный timestamp.
<?php
date('M', 123123123); // Nov
Различных опций форматирования в функции date()
— десятки. Все они подробно перечислены на странице документации. Вряд ли стоит их все запоминать, но понимать общий принцип работы — полезно. Все опции могут комбинироваться между собой в любых вариациях.
<?php
date('l jS \of F Y h:i:s A'); // Thursday 26th of July 2018 10:58:55 AM
Функция mktime() генерирует timestamp по информации о времени: секундах, часах, минутах и дате.
int mktime ([ int $hour = date("H") [, int $minute = date("i") [, int $second = date("s") [, int $month = date("n") [, int $day = date("j") [, int $year = date("Y") ]]]]]] )
mktime()
— многословная функция, каждая часть даты и времени передается как отдельный параметр.
<?php
mktime(0, 0, 0, 7, 1, 2000); // 962409600
Одна из самых сложных деталей при работе с датами — часовые пояса (time zones). Вся земля делится на 24 часовых пояса, так что в соседних поясах время чаще всего отличается на час. Нулевым временем считается всемирное координированное время (UTC). Часовые пояса вокруг земного шара выражаются, как положительное или отрицательное смещение от UTC. Например, в Москве тайм зона +3.
Изюминку в этот механизм добавляет переход на летнее и зимнее время. Причем если пояса строго фиксированы, то переход на зимнее и летнее время — прерогатива конкретных государств, которые переодически его вводят или отменяют. Время UTC никогда не переводят, смещения происходят относительно него. Кроме этого есть ещё тысяча и одна проблема.
Главное правило при работе с датами — хранение и сравнение должно производиться в UTC формате. А вот выводить даты лучше в той зоне, в которой живёт пользователь.
Проверить текущую зону можно функцией date_default_timezone_get()
. Установить зону функцией date_default_timezone_set()
.
Вам ответят команда поддержки Хекслета или другие студенты.
Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.
Загляните в раздел «Обсуждение»:
Статья «Ловушки обучения»
Вебинар «Как самостоятельно учиться»
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.
Наши выпускники работают в компаниях:
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Зарегистрируйтесь или войдите в свой аккаунт
Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу