我想将出生日期存储为数据库中的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
PS:数据库字段定义为:bDate int(4)UNSIGNED
答案 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测量,但通常作为当地时间和时区给出。但是,在通常情况下,人们通常不会收集这种详细程度。
答案 1 :(得分:2)
Unix不知道您存储的是出生日期。它只知道您正在以Unix格式存储时间戳。时间戳包括时间组件。
当您从出生日期转换为时间戳,然后从时间戳转换为出生日期时,您需要使用一致的时区,以避免任何方向的时差。
使用UTC是一个不错的选择。关键是一致性。