MW211 EXIT

devlog
設計/日時の切り上げ
2013年09月29日
日時を切り上げる場合には注意が必要だ。

例えば、10秒単位に切り上げる場合(例えば、12秒は20秒に切り上げられる)、
51秒は60秒に切り上げられるのだが、時刻関数が0~59秒までしか許容していない場合、
エラーとなってしまう。
例)PHPのDateTimeクラスのコンストラクタなど

だからといって、「+1分と0秒」とかで安易に対応してはいけない。
今度は「59分51秒」の場合、「60分00秒」で0~59分しか許容していない場合、
こちらでエラーとなってしまうからだ。

切り捨てはたいてい問題はない。0秒を下回ることはないからだ。

ということで、切り捨てて、一単位分加算するという回避方法が考えられる。
例えば、こんな感じ(PHPのDateTimeクラスの例)。
┌──────────────────────────────────────┐
│if ($newDateTime->format('i') % $ブロック単位) {                            │
│    $ss = floor($newDateTime->format('s') / $ブロック単位) * $ブロック単位; │
│    $newDateTime->modify(sprintf('%04d-%02d-%02d %02d:%02d:00',             │
│                                 $newDateTime->format('Y'),                 │
│                                 $newDateTime->format('m'),                 │
│                                 $newDateTime->format('d'),                 │
│                                 $newDateTime->format('H'),                 │
│                                 $newDateTime->format('i'),                 │
│                                 $ss));                                     │
│    $newDateTime->modify('+' . $ブロック単位 . ' seconds');                 │
│}                                                                           │
└──────────────────────────────────────┘
分類:設計