RubyのDate型で日付の差分を「□年◯ヶ月△日」で取得する方法


現在、RubyのDate型を利用して2つのDate型インスタンスから、  
その差分の日数を「□年◯ヶ月△日」で取得する方法を考えいているのですが上手く行きません。

例) d1 = Date.new(2014,3,3), d2 = Date.new(2014,5,10)  
望んでいる出力  
'0年2ヶ月7日' = date_difference(d1,d2)

結果はStringオブジェクトでなくても構いません。

現状はIntegerで日数の差分を取得を取得しています。（上の例の場合：68日）  
ですが、そこから上手く年、月、日に変換する事ができていません。  
主に日数の差が1月以上ある際に、月数を出すために、その月の日数（30,31,28など）によって除数が変わるためアルゴリズムが複雑になってしまうという問題があります。

上記ような理由があり、期待する値をシンプルに求めるためにDate型の機能を使用できればと思っています。  
なにか思い当たる節がある方がいらしゃったら教えていただけると幸いです。  
また,Date型を使用しなくてもスマートに書ける方法が思いつく方がいましたら、そちらでも構いません。




d1 <= d2 限定ですが、こんな感じでどうでしょう？

[code]

    require 'date'
    
    d1 = Date.new( 2014, 3, 3 )
    d2 = Date.new( 2014, 5, 10 )
    
    # d1の1日を作ってd2を補正
    d2 -= d1 - Date.new( d1.year, d1.month, 1 )
    
    # 月数で計算
    diff_months = d2.year * 12 + d2.month - d1.year * 12 - d1.month
    
    # 年月日に戻す
    diff_years = diff_months / 12
    diff_months -= diff_years * 12
    diff_days = d2.day - 1
    
    puts "#{diff_years}年#{diff_months}ヶ月#{diff_days}日"
    
[/code]




d1 <= d2 限定ですが、こんな感じでどうでしょう？

[code]

    require 'date'
    
    d1 = Date.new( 2014, 3, 3 )
    d2 = Date.new( 2014, 5, 10 )
    
    # d1の1日を作ってd2を補正
    d2 -= d1 - Date.new( d1.year, d1.month, 1 )
    
    # 月数で計算
    diff_months = d2.year * 12 + d2.month - d1.year * 12 - d1.month
    
    # 年月日に戻す
    diff_years = diff_months / 12
    diff_months -= diff_years * 12
    diff_days = d2.day - 1
    
    puts "#{diff_years}年#{diff_months}ヶ月#{diff_days}日"
    
[/code]

