Должен ли я использовать метку времени или текстовое поле в MySQl для времени / даты UTC - PullRequest
2 голосов
/ 04 января 2010

Я прочитал отметку времени mysql, которая может содержать значение только с 19700101000000 до 2037 года. Я серьезно сомневаюсь, что мое приложение будет тогда, я уверен, что оно не будет, но есть идеи, что люди будут использовать для отметки времени текстовое поле?

Ниже приведен пример того, как в настоящее время я вставляю запись mysql с полем mysql datetime, и вы можете видеть, что я использую now () в PHP ниже, теперь я перекодирую свой сайт, и я Я собираюсь предложить поддержку часового пояса для отображения правильного времени для пользователей, поэтому мне нужно было сохранить дату и время как метку времени UTC.

<?PHP
$sql = "INSERT INTO online_users 
    (user_id,
    online_id,
    ip,
    datetime,
    location,
    gender) 
    values ('$cache->userid,$unid,$LOCALIP,NOW(),$location,$g)";
executeQuery($sql);
?>

Исходя из моего кода выше и моей информации выше, как мне отформатировать этот код для вставки времени и даты в UTC, и мне следует использовать поле метки времени или текстовое поле в MySQL? Мне нужно будет изменить время в моем php при его частом отображении, например, на некоторых постах я вычисляю время, прошедшее с момента mysql (2 дня и 4 часа и 34 секунды назад). Мне также нужно использовать время для запроса таких вещей, как пользователи на прошлой неделе, чтобы войти в систему. Я не спрашиваю, как сделать то, что я только что опубликовал, чтобы показать, на что я буду использовать время, на всякий случай, которое поможет определить лучший метод, которым я должен его сохранить.

Ответы [ 6 ]

3 голосов
/ 04 января 2010

Лучшим столбцом для хранения даты и времени является DATETIME . Это упрощает ваш код и запросы, поскольку вам не нужно все время конвертировать туда и обратно в целочисленные временные метки, а MySQL обрабатывает всю логику сравнения дат за вас.

Вы можете использовать функции MySQL UTC_DATE () , UTC_TIME () и UTC_TIMESTAMP () вместо NOW () для получения текущих временных отметок UTC внутри MySQL.

2 голосов
/ 05 января 2010

Я всегда сохранял время эпохи / юникса как целое число со знаком в полях базы данных. MySQL имеет функции UNIX_TIMESTAMP() & FROM_UNIXTIME(). Я получил и буду получать уведомления об этом, но математика дат проста, языковая поддержка приложения для этого формата даты почти повсеместна, и я могу без страха поддерживать операционные системы (например, информацию о расписании авиакомпаний) независимо от политических прихотей относительно исправлений летнего времени системных обновлений / обновлений.

Некоторые веб-сайты даже не удосуживаются выполнить преобразование даты и позволяют клиентскому JavaScript проецировать его по местному времени.

Дельты времени, о которых вы упомянули (т. Е. Сколько времени между последним просмотром), можно легко упростить, так как у вас есть количество прошедших секунд.

1 голос
/ 05 января 2010

Я перепробовал все упоминания в этом вопросе / ответе, но ничего не работало правильно, в конце концов единственный способ, которым я смог получить функцию php timezones date_default_timezone_set () для корректной работы с датой и временем из mysql, состоял в том, чтобы сохранить их как целое число, а затем он работает идеально. Для меня нет проблем с более медленной сортировкой, потому что я сортирую по номеру идентификатора вместо даты, но сортировать по дате я не думаю, что будет слишком сложно, когда я выясню, сколько секунд между ними.

Когда я использую целочисленное поле в mysql, я могу сохранить метку времени UTC как это 1262658989. Когда вы используете поле метки времени или даты и времени в mysql, оно автоматически преобразует его в этот стиль 2003-04-14 00:00:00 что по какой-то причине затрудняет работу с часовыми поясами.

Используя целое число вместо этого, я могу получить метку времени UTC в PHP, используя этот код:

gmdate('U', time())
0 голосов
/ 04 января 2010

Вы также можете использовать ON UPDATE CURRENT_TIMESTAM P для обновления поля при каждом обновлении строки

0 голосов
/ 04 января 2010

Если вам нужно поддерживать разные часовые пояса, самым разумным выбором для дат будет тип столбца TIMESTAMP , даже если он имеет диапазон до 2038-01-19 03:14:07. Это все равно даст вам 28 лет, чтобы подумать о том, как решить эту проблему.

Преимущество использования типа столбца TIMESTAMP заключается в том, что все даты сохраняются в формате UTC и по запросу преобразуются в необходимый часовой пояс. Таким образом, вам не нужно беспокоиться о часовых поясах. Однако это не решит всех ваших проблем.

0 голосов
/ 04 января 2010

Я бы использовал поле метки времени для дат, так как это сделает сортировку / фильтрацию быстрее, чем в текстовом поле. Через 26 лет вы можете связаться с нами, чтобы выяснить, что вам нужно сделать, чтобы преодолеть Y2K37.

; -)

...