Я использую Yii2
и мне было интересно, как он решает, какой часовой пояс хранить данные в базе данных?
Я заметил, что $ defaultTimezone, который, по-видимому, указывает на то, что он просто контролирует, в какой временной зоне должны присутствовать ваши входные данные, передавая его таким функциям, как функция asTime, и использует временной диапазон форматирования для преобразования указанных данных в правильный вывод времени.
Но мне интересно, как вы убедитесь, что вставляете данные в свою базу данных в нужном часовом поясе, чтобы можно было доверять значение $defaultTimezone
?
Нужно ли запускать что-то подобное для MySQL
:
SET time_zone = timezonename;
Если вы хотите использовать только один часовой пояс для своего приложения, вы можете просто добавить следующую строку в свой файл конфигурации или сценарий ввода (по умолчанию web / index.php):
date_default_timezone_set('UTC');
Хорошо, вот что я обнаружил по этому поводу:
отметка времени:
MySQL автоматически сохранит это значение в UTC
и преобразует то, что вы даете ему в UTC и обратно, в зависимости от часового пояса сервера mysql.
Однако некоторые примечания:
Я бы рекомендовал установить часовой пояс вашего сервера в UTC
примерно так:
SET time_zone = 'UTC';
Тогда не имеет значения, есть ли у вас серверы по всему миру, вы всегда будете получать те же данные, которые будут переданы на каждый сервер, – это будут те же данные, что и вы переданы ему, поэтому это будет основано на вашем часовом поясе PHP, поэтому если вы хотите, чтобы он возвращал время UTC
вы должны использовать функцию NOW()
myswl для хранения TIMESTAMP.
Если вы не установите часовой пояс сервера, MySQL будет в основном полагаться на часовой пояс SYSTEM
и каждый сервер получит другую временную метку назад, исходя из своего часового пояса.
Если вы хотите внедрить изменение UTC
в существующую систему, то оно будет действовать по-разному. Независимо от того, что вы передаете, кажется, он всегда будет возвращать дату в UTC
.
Если у вас установлен часовой пояс вашего сервера на UTC
а затем вы измените его на что-то еще, тогда все начнет выглядеть немного волосатым.
дата и дата
Насколько мне известно, они просто хранят и возвращают точные данные, которые вы им даете.
Хранение временных меток unix:
Как и выше, они будут хранить только то значение, которое вы им даете, поскольку вы просто храните их как любое старое integer
; но если вы хотите сохранить UNIX_TIMESTAMP
метку в формате UTC, вы можете использовать UNIX_TIMESTAMP
как указано в @ Ngô Văn Thao, или если вам нужно сделать это в PHP, тогда вы можете сделать что-то вроде этого:
$tz = new DateTimeZone('UTC'); $dt = new DateTime("now", $tz); $utc_timestamp = $dt->format('U');
U
представляет собой параметр форматирования временной отметки unix в функции даты php; вы можете использовать любые параметры форматирования, если хотите вернуть дату в другом формате.
Итак, короче …
UTC
используя SET time_zone = 'UTC'
NOW()
при вставке данных в поля TIMESTAMP
UNIX_TIMESTAMP()
или предоставленный код выше, чтобы сохранить ваши unix timestamps
в UTC Выполнение вышеизложенного всегда должно быть гарантировано, что вы получите соответствующие даты / даты в формате UTC.