将数据库中的出生日期存储为UNIX时间?

Pie*_*iet 4 mysql sql date strtotime

我想将出生日期存储为我的数据库中的UNIX时间戳,因为这样可以使数据库保持较小并加快查询速度.

但是,当使用strtotime将出生日期转换为UNIX时间时,它将输出错误的值,即输入的值与一小时的差异.我知道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 
Run Code Online (Sandbox Code Playgroud)

PS:数据库字段定义为:bDate int(4)UNSIGNED

Mat*_*int 7

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测量,但通常作为当地时间和时区给出.但是,在通常情况下,人们通常不会收集这种详细程度.