我有一个问题,我正在编写一个对服务有某种保留的应用程序。该服务有一个持续时间,例如:
1小时15分钟的按摩
然后我为这项服务建立了一个预订系统。在进行预订时,我需要计算结束日期时间。
所以我的数据库中有一个“开始”的日期时间,我不知道如何存储持续时间。因此,在预订之后,我可以轻松地说这将在其他日期时间结束。
我希望我足够清楚。
问题是如何在数据库中存储持续时间以及如何增加开始日期,所以我对时区等没有任何问题。
感谢帮助!
我有一个问题,我正在编写一个对服务有某种保留的应用程序。该服务有一个持续时间,例如:
1小时15分钟的按摩
然后我为这项服务建立了一个预订系统。在进行预订时,我需要计算结束日期时间。
所以我的数据库中有一个“开始”的日期时间,我不知道如何存储持续时间。因此,在预订之后,我可以轻松地说这将在其他日期时间结束。
我希望我足够清楚。
问题是如何在数据库中存储持续时间以及如何增加开始日期,所以我对时区等没有任何问题。
感谢帮助!
一种只使用 PHP(而不使用 SQL)的方法,时间是在秒内管理以简化计算:
$reservation = new Reservation(); // Your entity object
$startDate = new \DateTime('now');
$endDate = $startDate;
$endDate->modify('+'.4500.' seconds'); // Update the end time with the duration of the service
$reservation->setStartDate($startDate);
$reservation->setEndDate($endDate);
// Save the reservation
$em = $this->getDoctrine()->getManager();
$em->persist($reservation);
$em->flush();
编辑 1:
要回答您的时区问题,最容易(我认为)是使用时间戳!在显示时,时间戳将被转换为时区日期。从datetime获取时间戳也是一样的,都是按照机器的时区计算的。所以时间戳在时区之间共享^^
这里的片段编辑:
// ...
// Save timestamp instead of datetime
$reservation->setStartTimestamp($startDate->getTimestamp());
$reservation->setEndTimestamp($endDate->getTimestamp());
// ...
编辑 2:
要回答您的评论,如果您更改了持续时间,只需将持续时间保存在数据库中即可。
// First save
$reservation->setDuration(4000); // seconds
并且在编辑持续时间时:
// Duration of a reservation change
// <- Load the $reservation to edit
$date = new \DateTime();
$date->setTimestamp($reservation->getStartTimestamp()); // Got start date
$reservation->setDuration($reservation->getDuration() + 2000); // For example, duration is increased of 2000 second
$endDate = $date;
$endDate->modify('+'.$reservation->getDuration().' seconds'); // Use start date and recalculate new end date
$reservation->setEndTimestamp($endDate->getTimestamp());
// <- Then update $reservation with a persist
除了 Sybio 的回答之外,您还可以time
在预订期间设置数据类型。然后 Doctrine 将接受\DateInterval
.
$reservation
->setStartDate(new \DateTime('now'))
->setDuration(\DateInterval::createFromDateString('75 minutes'))
;
然后在您的控制器中,您可以执行以下操作:
$em = $this->getDoctrine()->getManager();
$reservation = $em->getRepository('AcmeMassageParlorBundle:Reservation')->find($id);
// The instance has to be cloned before being modified, to avoid accidentally
// altering the start time.
$endDate = clone $reservation->getStartDate();
$endDate->add($reservation->getDuration());
// To get the date time in ISO format, use
$endDate->format('Y-m-d H:i:s');