我一直使用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)可能更难
一些。