DateTime::Duration
(._.) φ メモメモ
- DateTime オブジェクト同士で subtract(マイナス演算子の overload も)すると,DateTime::Duration がかえる
- DateTime::Duration はわりと人間的に情報を持ってる
- たとえば DateTime(2006/08/18 12:34:56) - DateTime(2004/03/02 09:08:07) は DateTime::Duration(2y5m16d 3h26m49s) 的になる
- だから DateTime(2006/07/07) - DateTime(2006/06/06) と DateTime(2006/03/03) - DateTime(2006/02/02) は等価
- すなわち,これらの DateTime::Duration の「日数」を計算できない
- たとえ DateTime::Duration->in_units('days') したとしても
- なぜなら DateTime::Duration 自身は始点終点の情報をもってないから
- DateTime::Duration->in_units() で可換な単位は
- year <=> months (かならず 12mpy)
- weeks <=> days (かならず 7dpw)
- hours <=> minutes (かならず 60mph)
- seconds <=> nanoseconds (かならず 1000000nps)
- だから DateTime::Duration->new( years => 1, months => 15 ) の
- ->in_units('months') は 27
- ->in_units('days') は 0(可換じゃないから)
- と,非直感的。
- とくに minutes <=> seconds が非可換なのに要注意(閏秒!)
- じゃあたとえば 2 つの DateTime の差分を分でとりたいときはどうするか
- 案 1. 両者の epoch の差分を 60 で割る
- 案 2. $dt1->delta_ms($dt2) で minutes と seconds に落とし込まれた DateTime::Duration が帰ってくる
- 同じように delta_md(months, days)と delta_days(days)もあるでよ