【问题标题】:Store date of birth in database as UNIX time?将数据库中的出生日期存储为 UNIX 时间?
【发布时间】:2015-10-14 15:27:10
【问题描述】:

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

【问题讨论】:

  • “但是出生日期与某人的居住地无关,对吧?” -正确的。您还有其他问题吗?
  • 当然,出生日期与出生地有关。一个于 2015 年 2 月 1 日凌晨 1 点出生在巴黎的人,如果他的母亲赶上了飞往纽约的飞机,他的出生日期应该是 2015 年 1 月 31 日。
  • 出生日期与一个人的出生地有关 - 但 年龄 与一个人当前的居住地有关。看我的回答。

标签: mysql sql date strtotime


【解决方案1】:

对于整个日历日期(例如出生日期)来说,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时间的整数。

还要考虑年龄的评估取决于此人当前所在的时区,而不是他们出生的时区。如果提问者不知道此人的位置 - 那么相关的就是提问者的时区。 “按照你的说法,你几岁了?”不一定和“我说你几岁?”一样。

当然,您居住的地方实际上并不会让您变老或变年轻 - 但它归结为我们人类如何根据当地日历评估年龄。如果您要问“我有多少 分钟 岁?”那么答案取决于您出生的瞬时时间点 - 可以用 UTC 来衡量,但通常会以本地时间和时区的形式给出。但是,在常见情况下,通常不会收集到那种详细程度。

【讨论】:

  • 感谢您的精彩解释,真的很有帮助!
【解决方案2】:

Unix 不知道您正在存储出生日期。它只知道您正在以 Unix 格式存储时间戳。时间戳包含一个时间组件。

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

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

【讨论】:

    猜你喜欢
    • 2011-02-04
    • 1970-01-01
    • 2011-04-17
    • 2015-07-04
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2017-05-31
    相关资源
    最近更新 更多