我无法理解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
当柏林用户填写12:00(欧洲/柏林的12:00 - UTC时间的10:00)时,doctrine会保存一个没有时区的日期(12:00)。
当你检索你的DateTime字段时,它被Doctrine重新创建为12:00 UTC(默认应用程序时区),而不是12:00 柏林。
因此,您需要存储User时区以便比较用户提供的日期和系统提供的日期。参见Doctrine文档
当DateTime::diff
比较两个日期对象时,是否将其设置为任何时区都无关重要,因为它-据我所知-将首先创建时间,然后设置时区以适当地适应内部日期。所以new DateTime('now', new DateTimezone('Europe/Berlin'))
和new DateTime('now', new DateTimezone('UTC'))
引用相同的时间。
因此,您必须查看您的$entry->getStartTime()
所在的时区,并适当地进行调整以获得所需的结果。由于开始(和结束)时间是通过表单给出的,我假设您将它们添加到实体中,而不包含任何时区信息或带时区UTC,因此您将UTC日期时间与欧洲/柏林日期时间进行比较。您应该将这些带有时区信息的日期添加到数据库中。
因此,作为一个解决方案,以下应该工作,但它不是一个解决实际问题!
$currentDate = new 'DateTime();
$currentDate->modify($currentDate->getOffset() . ' seconds');
$diff = $currentDate->diff($entry->getStartTime());
new 'DateTime()返回服务器时间。我猜你们的服务晚了两个小时。
一个date命令会告诉你我是否正确。