以正确的方式存储时间戳

时间:2013-06-03 18:20:06

标签: php mysql date time timestamp

我使用UNIX TIMESTAMPS来实现一切,2038年的想法正在逐渐消失。无论如何,我一直把时间戳存储为int(10),因为当我记得因为当我试图使用TIMESTAMP数据类型时,它一直在向字段添加“CURRENT TIMESTAMP”而我不想要那样。所以我的问题是存储时间戳的正确方法是什么? (并且每次更新记录时都不更新)

此外,考虑到2038年即将到来,希望我们都能活着,那么时间戳的最佳替代品是什么?

在另外一个补充中,当时间戳消失时strtotime将会发生什么?

3 个答案:

答案 0 :(得分:2)

我能想到的最佳方式是使用DateTime列类型。检索日期时,如果需要时间戳,只需使用PHP strtotime($row['Date_Column']);即可获得时间戳。

请注意,DateTime以下列格式记录YYYY-MM-DD HH:MM:SS

另请注意,如果您的应用程序在不同的时区使用,您需要在PHP端处理它,具有某种环绕功能,如:

function dateTimezone($ts, $format) {
   $timezone = YOUR TIME ZONE

   $d = new \DateTime();
   $d->setTimestamp($ts);
   $d->setTimezone(new \DateTimeZone($timezone));

   return $d->format($format);
}

将返回您的用户所在时区的日期,只需传递另一个参数User ID或User Name,并根据用户选择时区变量。

然后使用以下代码而不是使用php日期函数:dateTimezone(strtotime($row['MYSQL_DATE_COLUMN']), 'm/d/Y h:ia');

答案 1 :(得分:2)

使用本机mysql datetime字段。它的支持日期范围为

 1000-01-01 00:00:00 -> 9999-12-31 23:59:59

对于大多数用途来说应该足够了。正如您所说,32位时间戳将在2038年1月回归。虽然64位time_t正变得越来越普遍,但它并不是您可以依赖的东西。

答案 2 :(得分:1)

DATETIME:

min = 1000-01-01 00:00:00
max = 9999-12-31 23:59:59
size = 8bytes

时间戳:

min = 1.1.1970 00:00:00
max = 2038-01-19 03:14:07
size = 4bytes

请注意,TIMESTAMP支持时区。同时将mysql插入到TIMESTAMP当前值的行的第一个TIMESTAMP列中,如果在更新行时没有使用特定值,它会自动更新。

所以我想你想使用DATETIME。