2015-10-14 2 views
3

Я хочу сохранить дату рождения как временную метку UNIX в моей базе данных, потому что это держит базу данных маленькой и ускоряет выполнение запросов.Укажите дату рождения в базе данных как время UNIX?

Однако при преобразовании даты рождения в UNIX-время с использованием strtotime оно выдаст неверное значение, а именно введенное значение с разницей в один час. Я знаю, что установка date_default_timezone_set('UTC'); приведет к правильной дате рождения в UNIX, но дата рождения не имеет ничего общего с тем, где кто-то живет, правильно? Дата рождения - это дата рождения, независимо от того, где кто-то живет.

Так в примере

$bday = 20; 
$bmonth = 6; 
$bYear = 1993; 

strtotime($cBday.'-'.$cBmonth.'-'.$cByear) // output: 740527200 == Sat, 19 Jun 1993 22:00:00 

PS: определяется поле базы данных, как: bDate Int (4) UNSIGNED

+0

«Но дата рождения не имеет ничего общего с тем, где кто-то живет, верно?» -Верный. У вас был другой вопрос? – dan08

+0

Конечно, дата рождения связана с тем, где родился. Лицо, родившееся в 1am 01.02.2015 в Париже, родилось бы 31.01.2015, если его мать поймала самолет в Нью-Йорк. – SWeko

+0

Дата рождения связана с родиной - но * возраст * связан с тем, где живет один * в настоящее время *. См. Мой ответ. –

ответ

6

UTC не является отличным выбором для целых календарных дат, таких как дата рождения.

Мой день рождения: 1976-08-27. Не 1976-08-27T00:00:00Z.

  • Я в настоящее время живу в часовом поясе США.

  • Мой следующий день рождения от 2016-08-27T00:00:00-07:00 до 2016-08-28T00:00:00-07:00

  • В UTC, что не эквивалентно 2016-08-27T07:00:00Z до 2016-08-28T07:00:00Z

Конечно, если я перееду в другой часовой пояс до этого, я Я буду отмечать свой день рождения на совершенно другом наборе диапазонов.

  • Если я перееду в Японию, то мой день рождения придет на 16 часов раньше.

  • Мой следующий день рождения не будет от 2016-08-27T00:00:00+09:00 до 2016-08-28T00:00:00+09:00

  • В UTC, что не эквивалентно 2016-08-26T15:00:00Z до 2016-08-27T15:00:00Z

Таким образом, дата рождения (или юбилейной даты, даты проката, и т. д.) должны храниться как простой год, месяц и день. Нет времени и нет часового пояса.

В MySQL используйте тип DATE. Не используйте DATETIME, TIMESTAMP или целое число, содержащее время Unix.

также считают, что оценка возраста зависит от часового пояса, в том числе Местонахождение пользователя сейчас не, а не при появлении часового пояса, в котором они родились. Если местоположение человека неизвестно для искателя - тогда это актуальный часовой пояс. «Сколько вам лет?» не обязательно то же самое, что «Сколько вам лет?».

Конечно, где вы живете, на самом деле вы не станете старше или моложе, но это зависит от того, как мы, люди, оцениваем возраст в годах на основе наших местных календарей. Если бы вы спросили: «Сколько минут старый я?» тогда ответ зависит от моментального момента времени, в котором вы родились, - который может быть измерен в формате UTC, но обычно он предоставляется как местное время и часовой пояс. Однако в общем случае, как правило, этот уровень детализации не собирается.

+0

Спасибо за отличное объяснение, очень полезно! – Piet

2

Unix не знает, что вы сохраняете дату рождения. Он просто знает, что вы сохраняете временную метку в формате Unix. Временная метка включает компонент времени.

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

Использование UTC - прекрасный выбор. Ключ, хотя и согласованность.

Смежные вопросы