Вы когда-нибудь задумывались о том, как хранится в компьютере время? В этом уроке мы обсудим, как работают время и дата и где они хранятся.
Время
Как вы знаете, включение и выключение компьютера никак не влияет на часы. Можно сделать вывод, что часы в компьютере работают сами по себе.
Это действительно так. Основные часы компьютера — аппаратные. Они живут самостоятельной жизнью и имеют свою собственную батарею. При включении компьютер считывает данные этих часов, записывает к себе в память и начинает самостоятельно отсчитывать время. Эти часы называются системными. Любое изменение системных часов влияет и на аппаратные.
В 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()
Функция mktime() генерирует timestamp по информации о времени: секундах, часах, минутах и дате:
mktime(
int $hour,
?int $minute = null,
?int $second = null,
?int $month = null,
?int $day = null,
?int $year = null
): int|false
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()
.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты