【问题标题】:How to get months and days between two date如何获取两个日期之间的月份和日期
【发布时间】:2014-11-20 03:45:18
【问题描述】:

抱歉,我尝试为剩余日期 MonthsDays 编码,不幸的是我得到了错误的结果。任何帮助将不胜感激。谢谢!

SimpleDateFormat formatter= new SimpleDateFormat("dd-MM-yyyy");
String sdate    = "08-02-2016";
String edate     = "02-02-2017";   

Date startdate = formatter.parse(sdate);
Date enddate   = formatter.parse(eddate );

Calendar startCalendar = new GregorianCalendar();
startCalendar.setTime(startdate);

Calendar endCalendar = new GregorianCalendar();
endCalendar.setTime(enddate);

int diffYear = endCalendar.get(Calendar.YEAR) - startCalendar.get(Calendar.YEAR); //effdate -   currdate
int diffMonth = diffYear * 12 + endCalendar.get(Calendar.MONTH) -startCalendar.get(Calendar.MONTH); 
int diffDay= endCalendar.get(Calendar.DAY_OF_MONTH) -startCalendar.get(Calendar.DAY_OF_MONTH); 

预期结果:11 个月,25 天

P/s : JodaTime 不适用。

【问题讨论】:

  • 您使用的是 Java 8 吗?尝试通过减法计算日期之间的差异从来都不是一个好主意,它没有考虑日期/时间的特殊性,这就是 JodaTime 存在的原因......
  • 您只需要一些额外的逻辑来处理 CURDATE 的日期小于 EFFDATE 的日期的情况。其中哪一部分给您带来了困难?
  • 是的,正如 MadProgrammer 所说,这在 Java 8 中很容易——您使用 Period.between( ... ) 传递几个 LocalDate 对象。那么你有 Java 8 吗?
  • @MadProgrammer ,同意你的看法。因为使用减法方法不是一个好习惯。但我的 java 版本是

标签: java date elapsed


【解决方案1】:

我强烈建议您使用强大的 api 以获得可靠的结果,但如果您坚持手动执行,请尝试以下操作,它似乎给出了正确的结果(至少对于您的测试用例):

    SimpleDateFormat formatter= new SimpleDateFormat("dd-MM-yyyy");
    String CURRDATE    = "08-02-2016";
    String EFFDATE     = "02-02-2017";   

    Date startdate = formatter.parse(CURRDATE);
    Date enddate   = formatter.parse(EFFDATE);

    Calendar startCalendar = new GregorianCalendar();
    startCalendar.setTime(startdate);

    Calendar endCalendar = new GregorianCalendar();
    endCalendar.setTime(enddate);

    int monthCount = 0;
    int firstDayInFirstMonth = startCalendar.get(Calendar.DAY_OF_MONTH);
    startCalendar.set(Calendar.DAY_OF_MONTH, 1);
    endCalendar.add(Calendar.DAY_OF_YEAR, -firstDayInFirstMonth+1);

    while (!startCalendar.after(endCalendar)) {     
        startCalendar.add(Calendar.MONTH, 1);
        ++monthCount;
    }

    startCalendar.add(Calendar.MONTH, -1); --monthCount;
    int remainingDays = 0;
    while (!startCalendar.after(endCalendar)) {
        startCalendar.add(Calendar.DAY_OF_YEAR, 1);
        ++remainingDays;
    }

    startCalendar.add(Calendar.DAY_OF_YEAR, -1);
    --remainingDays;

    int lastMonthMaxDays = endCalendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    if (remainingDays >= lastMonthMaxDays) {
        ++monthCount;
        remainingDays -= lastMonthMaxDays;
    }

    int diffMonth = monthCount; 
    int diffDay = remainingDays; 

    System.out.println("diffMonth==="+diffMonth +" Month(s) and " + diffDay + " Day(s)");

【讨论】:

    【解决方案2】:

    我直接认为你不能像 z day y hr x min

    但你可以得到单独的天分秒,如下所示 -

        long diff = EFFDAT.getTime() - CURRDATE.getTime();
        long diffSeconds = diff / 1000 % 60;
        long diffMinutes = diff / (60 * 1000) % 60;
        long diffHours = diff / (60 * 60 * 1000);
        int diffInDays = (int) ((dt2.getTime() - dt1.getTime()) / (1000 * 60 * 60 * 24));
    

    更新

    希望它可以帮助 - 我认为你需要 Java 8

    LocalDate today = LocalDate.now();
    LocalDate birthday = LocalDate.of(1960, Month.JANUARY, 1);
    
    Period p = Period.between(birthday, today);
    long p2 = ChronoUnit.DAYS.between(birthday, today);
    
    System.out.println("You are " + p.getYears() + " years, " + p.getMonths() + " months, and " + p.getDays() + " days old. (" + p2 + " days total)");
    

    reference Oracle Page

    【讨论】:

    • 不!并非所有日子都是 24 小时。这大约有 25% 的时间会失败 - 也就是说,每当日期范围在夏令时结束并在冬季开始时。您还没有回答有关获得月份和日期的问题。
    猜你喜欢
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多