it-roy-ru.com

Как хранить метки времени UNIX с MySQL

Немного предыстории:

Мой сайт сильно зависит от координации пользователей в разных часовых поясах.

Я использую Carbon для обработки моих часовых поясов и расчетов на стороне сервера и moment.js на клиенте.

В результате был сделан выбор дизайна, чтобы все даты (например, время начала события) сохранялись как метки времени Unix.

Проблема

Я немного сбит с толку определением «отметка времени». В PHPMyAdmin метка времени - это не метка времени Unix, а формат даты:

2016-10-06 20:50:46

Поэтому, если вы хотите иметь поле по умолчанию для текущей временной отметки, вы получите текущую дату в GMT.

Это усложняет преобразование обратно в часовой пояс пользователя по сравнению с целым числом метки времени Unix ...

Вопрос:

Какого типа поля я должен хранить свои временные метки Unix как, в настоящее время я использую int(11) со значением по умолчанию none. По расширению ... есть ли способ сохранить текущую метку времени Unix (например, 1475971200) по умолчанию в MySQL?

8
Jethro Hazelhurst

Временная метка Unix представляет собой большое целое число (количество секунд с 1970-01-01 00:00:00 UTC), поэтому INT(11) - правильный тип данных.

К сожалению, я не думаю, что есть какой-либо способ указать значение по умолчанию, которое будет вставлять текущую метку времени. Вам нужно будет явно вызывать UNIX_TIMESTAMP() при вставке и использовать это. Вызовы функций не допускаются в спецификациях DEFAULT.

11
Barmar

Вы можете продолжать использовать неподписанный INT, но вам придется вручную установить метку времени при вставке (UNIX_TIMESTAMP()). 

Или вы можете использовать тип TIMESTAMP со стандартным CURRENT_TIMESTAMP (который хранится как int за кадром) и преобразовать его в int при выборе:
SELECT UNIX_TIMESTAMP(foo_field) FROM foo_table

Ссылка - Возможно ли создать столбец с UNIX_TIMESTAMP по умолчанию в MySQL?

2
George Kagan

На самом деле, вы должны использовать bigint или varchar, потому что максимум для int(11) составляет 2'147'483'647 (больше информации здесь ). 

Затем, как и в предыдущих ответах, вы должны вручную вставить UNIX_TIMESTAMP()

0
Luka Govedič