2013-06-02 45 views
3

我有一個問題,我正在編寫一個具有某種服務預留的應用程序。該服務有一個持續時間讓說,例如:Symfony/Doctrine Dateinterval(持續時間)如何將其存儲在數據庫中

按摩是耗時1小時15分鐘

然後我預約系統,此服務。雖然我正在做預訂,我需要計算結束日期時間。

因此,我在我的數據庫中有一個「開始」日期時間,我不知道如何存儲持續時間。所以在保留之後,我可以很容易地說,它會在其他一些日期時間結束。

我希望我已經夠清楚了。

的問題是如何存儲時間數據庫以及如何增加起始日期,所以我沒有與時區等

感謝您的幫助任何問題!

回答

4

一種方法,只用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:

要回答你的時區的問題,最更容易(我認爲)是使用時間戳!在顯示時,時間戳將被轉換爲時區日期。從日期時間獲取時間戳時,它是相同的,它是根據計算機的時區計算的。

// ... 

// 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 
+0

這是一個好主意,但如果我加入一些保留與持續時間拉特說,第二天4天,有將時間轉移?那麼我認爲它不會奏效。對? – newicz

+0

查看我最後一次編輯,但是這是一個完整的PHP解決方案,我不知道它是否適合您,或者您是否需要唯一的教義解決方案! – Sybio

3

除了Sybio的回答,您可以設置一個time數據類型的保留期限。然後教義將接受\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'); 
相關問題