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)もあるでよ