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

时间:2015-01-21 06:27:30

标签: php time

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

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

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

或者使用unix时间戳仍然完全可以接受?

1 个答案:

答案 0 :(得分:0)

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这样的“最低公分母”数据存储器可能更难了