我无法解决 DateTime()
的问题。我想要数据库中保存的一些时间和现在之间的差异。它可以在我的本地计算机上运行,但不能在实时服务器上运行。
这是我的字段定义:
/**
* @ORM\Column(name="start_time", type="datetime", nullable=true)
*/
protected $startTime;
/**
* @ORM\Column(name="end_time", type="datetime", nullable=true)
*/
protected $endTime;
设置开始和结束时间,然后计算差异始终有效:
$diff = $entry->getEndTime()->diff($entry->getStartTime());
如果只设置了开始时间,我想要与当前时间的差异,所以我这样做:
$diff = (new \DateTime())->diff($entry->getStartTime());
但这不起作用。 差异为低 2 小时。
开始和结束时间是通过表单输入设置的,如下所示:
// user inputs for example: 08:50 for $start and 17:45 for $end
$dateStr = date('Y-m-d');
$entry->setStartTime(new \DateTime($dateStr.' '.$start));
$entry->setEndTime(new \DateTime($dateStr.' '.$end));
我猜这 2 个小时的休息时间是因为时区为欧洲/柏林而不是 UTC,但是我该如何适应这种情况?
替换new\DateTime()
与 new\DateTime('now', new\DateTimeZone('Europe/Berlin'))
或 new\DateTime('now', new\DateTimeZone('UTC'))
没有效果。
感谢您的帮助。
根据要求进行编辑
$currentDate = new \DateTime();
$currentDate->modify($currentDate->getOffset() . ' seconds');
// var_dump($entry->getStartTime())
object(DateTime)#358 (3) {
["date"]=> string(19) "2014-06-29 09:20:00"
["timezone_type"]=> int(3)
["timezone"]=> string(3) "UTC"
}
// var_dump($currentDate)
object(DateTime)#337 (3) {
["date"]=> string(19) "2014-06-29 06:50:00"
["timezone_type"]=> int(3)
["timezone"]=> string(3) "UTC"
}
// local time: 11:20:00
// difference should be: 2:30 but is 0:30
最佳答案
当 Berliner 用户填写 12:00(12:00 欧洲/柏林 - UTC 时间 10:00)时,学说会保存一个没有时区的日期 (12:00)。
当您检索 DateTime 字段时,Doctrine 将其重新创建为 12:00 UTC(默认应用程序时区),而不是 12:00 柏林。
因此,您需要存储用户时区,以便将用户提供的日期与系统提供的日期进行比较。请参阅Doctrine documentation
关于php - Doctrine 和 DateTime 显示出错误的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24464558/