如何使用 Doctrine ODM 存储持续时间

How to store a duration with Doctrine ODM

我存储了代表具有教义的事件的文件。每个 $event 都有一个 $eventType。每个 $eventType 都有一个 $duration.

对于每个 $event 我只会存储 $begin 但不会存储结尾,因为它可以使用其 $eventType.[=19 的默认 $duration 来计算=]

存储每个事件类型的持续时间的最优雅方法是什么?

  1. 如果教义中存在 DateInterval 注释,我会选择它。但事实并非如此。
  2. 将持续时间的秒数保存为整数?
  3. 还有其他可能吗?

简化的 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) 给定日期?

第二个选项更常见,所以我会存储结束日期。