如果每个月有30天,计算年、月、日的差值

问题描述 投票:0回答:3

无法计算两个日期之间的年、月、日差异。问题是每月有30天,每年有365天,无一例外。这里有很多主题,但我还没有找到任何可以解决我的问题或帮助解决它的主题。我发现的每个题目都只是用正常的方式解决计算差异的问题,很简单。 我如何计算这样的差异?

我正在使用Java 7(没有机会安装joda时间)和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

谢谢。

java groovy
3个回答
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

将为您提供天数差异,假设一年有 365 天,月份有 30 天。 那么,差异将是:

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

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
投票

十年后......在现代 Java 中使用

Period
类。

Period period = 
    Period.between(
        LocalDate.parse( "2014-02-01" ),
        LocalDate.parse( "2015-02-01" )  
    );
© www.soinside.com 2019 - 2024. All rights reserved.