【问题标题】:Calculate difference in years, months, days if every month has 30 days如果每个月有 30 天,计算年、月、日的差异
【发布时间】:2015-04-23 19:42:47
【问题描述】:

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

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


    【解决方案1】:

    您的示例似乎不一致。在第一种情况下,结束日期是唯一的,在其他两种情况下是包含的。例如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
    

    【讨论】:

    • 在我看来它应该是包容性的,据我了解,你的例子是排他性的
    • 但结果不同。我的意思是: 2004-02-02 - 2004-06-24 => 0 4 23 - 没问题,但 2000-02-10 - 2003-01-18 返回 2 11 14 (应该是 9 天)
    【解决方案2】:

    在 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))
    }
    

    【讨论】:

    • 看起来,没关系。谢谢!
    猜你喜欢
    • 2018-04-24
    • 2021-09-06
    • 2021-07-18
    • 1970-01-01
    • 2019-08-03
    • 2020-09-26
    • 2014-05-12
    • 2021-02-18
    • 1970-01-01
    相关资源
    最近更新 更多