ExcelのDATEDIF関数のRubyによる実装

ネットで適当に検索した結果、見つかったこのページを参考にして実装してみました。ExcelのDATEDIF関数はバージョンによって挙動が異なりますが、1月に満たない日数を求める場合にマイナスという有り得ない結果になることもあります。DATEDIF関数は隠し関数のようですから、自己責任で使えということなのでしょう。

#!/usr/bin/env ruby
# -*- encoding: utf-8 -*-

require 'date'

def datedif(start_day, end_day, unit)
  years = (end_day.strftime('%Y%m%d').to_i -
          start_day.strftime('%Y%m%d').to_i) / 10000
  months = (end_day.strftime('%m%d').to_i - 
           start_day.strftime('%m%d').to_i) / 100
  months = months < 0 ? months+12 : months  
  days = end_day - start_day
  unit = unit.downcase
  case unit
    when 'y' then years
    when 'm' then years*12 + months
    when 'd' then (end_day - start_day).to_i
    when 'ym' then months
    when 'yd' then (end_day - (start_day >> 12*years)).to_i
    when 'md' then (end_day - (start_day >> 12*years+months)).to_i
    else false
  end
end

birthday_1 = Date.new(1988,6,28)
birthday_2 = Date.new(1988,7,11)

today = Date.today

puts datedif(birthday_1,today,'Y')
puts datedif(birthday_2,today,'Y')
puts datedif(birthday_1,today,'m')
puts datedif(birthday_2,today,'m') 

puts datedif(Date.new(2003,11,30),Date.new(2003,12,10),'md')
puts datedif(Date.new(2008,4,30),Date.new(2009,3,1),'md')
puts datedif(Date.new(2000,10,20),Date.new(2004,3,12),'md')
カテゴリー: Ruby パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です