2015-04-23 104 views
0

無法計算年,月,日兩個日期之間的差異。問題是每個月有30天,每年有365天,沒有例外。這裏有很多話題,但我還沒有找到任何可以解決我的問題或幫助它的東西。我發現的每個主題都只是解決了以正常方式計算差異的問題,這很簡單。 我該如何計算這種差異?如果每個月有30天,則計算年,月,日的差異

我使用Java 7(沒有機會安裝喬達時間)和groovy 2.4.0。

的例子是:

date from date to  y m d 
2014-02-01 - 2015-02-01 => 1 0 1 
2000-02-10 - 2003-01-18 => 2 11 9 
2004-02-02 - 2004-06-24 => 0 4 23 

感謝。

回答

1

在Groovy想出了這個,不知道這是否符合您的要求,但它給出了這個問題的結果:

def dateMalarkey(Date from, Date to) { 
    def val = [from, to].collect { d -> 
     def cal = Calendar.instance 
     cal.time = d 
     [y: cal[Calendar.YEAR], m: cal[Calendar.MONTH], d: cal[Calendar.DAY_OF_MONTH]] 
    }.inject { p, n -> 
     [y: Math.abs(p.y - n.y), m: Math.abs(p.m - n.m), d: Math.abs(p.d - n.d) + 1] 
    } 
    val.days = val.y * 365 + val.m * 30 + val.d 
    val 
} 

def inputs = [ 
    [from: '2014-02-01', to: '2015-02-01'], 
    [from: '2000-02-10', to: '2003-01-18'], 
    [from: '2004-02-02', to: '2004-06-24'] 
] 

inputs.each { d -> 
    println "$d.from - $d.to => " + 
     dateMalarkey(Date.parse('yyyy-MM-dd', d.from), Date.parse('yyyy-MM-dd', d.to)) 
} 
+0

看起來像,沒關係。謝謝! – Alex

3

你的例子看起來並不一致。在第一種情況下,結束日期是排他性的,在另外兩種情況下是包含性的。例如2015-01-01到2015-01-01應該給0d還是1d? 假設獨家,看來你需要的東西可以這樣做: 鑑於沒有fromdate作爲yearFrom,monthFrom和daysFrom和TODATE爲yearTo,monthTo和daysTo:

days = -yearFrom*365-monthFrom*30-daysFrom+yearTo*365+monthTo*30+daysTo 

會給你在天的差異,假設365d年和30d月份。 然後,區別是:

yearDifference = days/365 (as integer) 
monthDifference = (days%365)/30 
daysDifference = (days%365)%30 

編輯後評論: 如果你需要的是包容性的,按照過去的兩個例子,只需添加一個在「天」:

days = -yearFrom*365-monthFrom*30-daysFrom+yearTo*365+monthTo*30+daysTo+1 
+0

在我看來,我噸應該是包容性的,你的例子是排他性的,據我所知 – Alex

+0

但結果是不同的。我的意思是說:2004-02-02 - 2004-06-24 => 0 4 23 - 可以,但2000-02-10 - 2003-01-18返回2 11 14(應該是9天) – Alex