在 PHP/MySQL 中使用时间和日期的首选方式



我一直使用unix时间戳;像time() - 作为int存储在数据库中 - 然后使用相关的函数,如date()mktime()等。我喜欢它的简单性。

我知道有一个DateTime类,但我自己没有用过。阅读 http://www.phptherightway.com/#date_and_time 似乎这是现在首选的做事方式。这是对的吗?这是现在的标准吗?

如果是这样,它如何存储在数据库中?

还是使用 unix 时间戳仍然是完全可以接受的?

UNIX 时间戳没有给你的一件事是时区。如果您需要与时区关联的时间戳,DateTime可以为您完成。请注意,MySQL没有时区感知DATETIME类型(例如Postgres),因此如果您要将DateTime对象序列化为MySQL,则必须单独存储时区。这看起来像这样:

$stmt = $db->prepare('INSERT INTO foo VALUES (:timestamp, :tz)');
$stmt->bind('timestamp', $dateTime->format('Y-m-d H:i:s'));
$stmt->bind('tz', $dateTime->getTimezone()->getName());

反之亦然:

$data = $db->query('SELECT * FROM foo')->fetch();
$dateTime = new DateTime($data['timestamp'], new DateTimeZone($data['tz']));

这有一个额外的问题,MySQL现在不知道时间戳的时区,所以如果你想让MySQL对这些时间戳进行正确的查询,你应该在插入数据库时将所有时间戳标准化为同一时区。

不过,DateTime对象的另一个优点是它可以处理比整数大得多的日期范围,尤其是在 32 位系统上。这在 64 位系统上得到了一定程度的缓解。

总结:

  • DateTime有一个时区,更大的值范围,它的界面可以说比通过函数推送整数更优雅
  • 但是,由于DateTime具有这些附加功能,因此将其正确序列化为"最低公分母"数据存储(如MySQL)可能更难
  • 一些。

相关内容

最新更新