2

我对所有事情都使用 UNIX TIMESTAMPS,而 2038 年的想法让我毛骨悚然。无论如何,自从我记得以来,我一直将时间戳存储为 int(10),因为当我尝试使用 TIMESTAMP 数据类型时,它一直在字段中添加“CURRENT TIMESTAMP”,而我不希望这样。所以我的问题是存储时间戳的正确方法是什么?(并且每次更新记录时都不会更新)

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

另外,当时间戳消失时,strtotime 会发生什么?

4

3 回答 3

2

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

注意 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);
}

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

然后使用以下命令代替使用 php date 函数:dateTimezone(strtotime($row['MYSQL_DATE_COLUMN']), 'm/d/Y h:ia');

于 2013-06-03T18:27:36.003 回答
2

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

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

这对于大多数任何目的都应该足够了。正如您所说,32 位时间戳将在 2038 年 1 月结束。虽然 64 位 time_t 变得越来越普遍,但您还不能依赖它。

于 2013-06-03T18:28:06.837 回答
1

约会时间:

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。

于 2013-06-03T18:44:27.210 回答