如何使用 Doctrine ODM 存储持续时间
How to store a duration with Doctrine ODM
我存储了代表具有教义的事件的文件。每个 $event
都有一个 $eventType
。每个 $eventType
都有一个 $duration
.
对于每个 $event
我只会存储 $begin
但不会存储结尾,因为它可以使用其 $eventType
.[=19 的默认 $duration
来计算=]
存储每个事件类型的持续时间的最优雅方法是什么?
- 如果教义中存在 DateInterval 注释,我会选择它。但事实并非如此。
- 将持续时间的秒数保存为整数?
- 还有其他可能吗?
简化的 eventType 模型如下所示
<?php
/**
* Class EventType
* @ODM\Document(collection="EventType")
*/
class EventType {
/**
* @var $duration int
* @ODM\Int
*/
private $duration;
}
正如您提到的,您可以以秒为单位保存持续时间。
有一个 getEnd 方法非常简单:
/**
* return \DateTime
*/
public function getEnd()
{
$end = clone $this->begin;
return $end->add(new DateInterval('PT' . $this->duration . 'S'));
}
或者您可以存储 $end 日期,而不是持续时间,您也可以计算它:
/**
* return \DateInterval
*/
public function getDuration()
{
return $begin->diff($end);
}
日期差异的棘手之处在于夏令时:有时您可以
date + 3600seconds == date + 2*3600seconds
因此,您应该考虑对结束日期进行何种查询:您 select 事件会持续(多于或少于)给定的时间,还是 select事件结束 (before/after/at) 给定日期?
第二个选项更常见,所以我会存储结束日期。
我存储了代表具有教义的事件的文件。每个 $event
都有一个 $eventType
。每个 $eventType
都有一个 $duration
.
对于每个 $event
我只会存储 $begin
但不会存储结尾,因为它可以使用其 $eventType
.[=19 的默认 $duration
来计算=]
存储每个事件类型的持续时间的最优雅方法是什么?
- 如果教义中存在 DateInterval 注释,我会选择它。但事实并非如此。
- 将持续时间的秒数保存为整数?
- 还有其他可能吗?
简化的 eventType 模型如下所示
<?php
/**
* Class EventType
* @ODM\Document(collection="EventType")
*/
class EventType {
/**
* @var $duration int
* @ODM\Int
*/
private $duration;
}
正如您提到的,您可以以秒为单位保存持续时间。 有一个 getEnd 方法非常简单:
/**
* return \DateTime
*/
public function getEnd()
{
$end = clone $this->begin;
return $end->add(new DateInterval('PT' . $this->duration . 'S'));
}
或者您可以存储 $end 日期,而不是持续时间,您也可以计算它:
/**
* return \DateInterval
*/
public function getDuration()
{
return $begin->diff($end);
}
日期差异的棘手之处在于夏令时:有时您可以
date + 3600seconds == date + 2*3600seconds
因此,您应该考虑对结束日期进行何种查询:您 select 事件会持续(多于或少于)给定的时间,还是 select事件结束 (before/after/at) 给定日期?
第二个选项更常见,所以我会存储结束日期。