将出生日期存储在数据库中作为 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: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 时间的整数。
还要考虑到年龄评估取决于此人当前所在的时区,而不是他们出生的时区。如果询问者不知道此人的位置 - 那么询问者所在的时区才是相关的。 "How old are you according to you?" 不一定等同于 "How old are you according to me?"。
当然,您居住的地方实际上并不能使您变老或变年轻——但这取决于我们作为人类如何根据我们当地的日历来评估年龄。如果您要问 "How many minutes old am I?",那么答案取决于您出生的瞬时时间点——可以用 UTC 来衡量,但通常会以本地时间和时区的形式给出。但是,在一般情况下,人们通常不会收集到那种程度的详细信息。
我想将出生日期作为 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: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 时间的整数。
还要考虑到年龄评估取决于此人当前所在的时区,而不是他们出生的时区。如果询问者不知道此人的位置 - 那么询问者所在的时区才是相关的。 "How old are you according to you?" 不一定等同于 "How old are you according to me?"。
当然,您居住的地方实际上并不能使您变老或变年轻——但这取决于我们作为人类如何根据我们当地的日历来评估年龄。如果您要问 "How many minutes old am I?",那么答案取决于您出生的瞬时时间点——可以用 UTC 来衡量,但通常会以本地时间和时区的形式给出。但是,在一般情况下,人们通常不会收集到那种程度的详细信息。