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

Store date of birth in database as UNIX time?

我想将出生日期作为 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

Unix 不知道您正在存储出生日期。它只知道您正在以 Unix 格式存储时间戳。时间戳包括时间部分。

当您从出生日期转换为时间戳,以及从时间戳转换回出生日期时,您需要使用一致的时区以避免两个方向的时差。

使用 UTC 是一个不错的选择。关键是一致性。

UTC 不是整个日历日期(例如出生日期)的理想选择。

我的生日是1976-08-27。不是 1976-08-27T00:00:00Z.

  • 我目前居住在美国太平洋时区。

  • 我的下一个生日是 2016-08-27T00:00:00-07:002016-08-28T00:00:00-07:00

  • 在 UTC 中,这相当于 2016-08-27T07:00:00Z 直到 2016-08-28T07:00:00Z

当然,如果我在那之前搬到不同的时区,我会在完全不同的一组范围内庆祝我的生日。

  • 如果我搬到日本,我的生日会提前16个小时

  • 我的下一个生日是 2016-08-27T00:00:00+09:002016-08-28T00:00:00+09:00

  • 在 UTC 中,这相当于 2016-08-26T15:00:00Z 直到 2016-08-27T15:00:00Z

因此,出生日期(或周年纪念日、入职日期等)应存储为简单的年月日。没有时间,也没有时区。

在MySQL中,使用DATE类型。不要使用 DATETIMETIMESTAMP 或包含 Unix 时间的整数。

还要考虑到年龄评估取决于此人当前所在的时区,而不是他们出生的时区。如果询问者不知道此人的位置 - 那么询问者所在的时区才是相关的。 "How old are you according to you?" 不一定等同于 "How old are you according to me?"。

当然,您居住的地方实际上并不能使您变老或变年轻——但这取决于我们作为人类如何根据我们当地的日历来评估年龄。如果您要问 "How many minutes old am I?",那么答案取决于您出生的瞬时时间点——可以用 UTC 来衡量,但通常会以本地时间和时区的形式给出。但是,在一般情况下,人们通常不会收集到那种程度的详细信息。