【问题标题】:Date difference in month , day月日日差
【发布时间】:2017-04-10 13:55:46
【问题描述】:

实际上,我陷入了小问题,但没有得到任何适当的解决方案。我有两个格式相同的日期,现在我想要区别,但格式是(年 - 月 - 天 - 小时 - 薄荷糖 - 秒),这是我的代码

  public static void getDifferent(Date startDate, Date endDate) {

        //milliseconds
        long different = endDate.getTime() - startDate.getTime();


        System.out.println("startDate : " + startDate);
        System.out.println("endDate : " + endDate);
        System.out.println("different : " + different);

        long secondsInMilli = 1000;
        long minutesInMilli = secondsInMilli * 60;
        long hoursInMilli = minutesInMilli * 60;
        long daysInMilli = hoursInMilli * 24;
        long monthInMili = daysInMilli * 30;

        long elapsedMonths = different / monthInMili;

        long elapsedDays = different / daysInMilli;
        different = different % daysInMilli;

        long elapsedHours = different / hoursInMilli;
        different = different % hoursInMilli;

        long elapsedMinutes = different / minutesInMilli;
        different = different % minutesInMilli;

        long elapsedSeconds = different / secondsInMilli;

        Log.d("Difference", "startDate: " + startDate.toString() + " endDate: " + endDate + " Months : " + elapsedMonths + " Days :" + elapsedDays + " Hours :" +
                elapsedHours + " Mint :" + elapsedMinutes + " Seconds :" + elapsedSeconds);


    }

由于这一行代码并不完美

long monthInMili = daysInMilli * 30;

所以请指导我。很长一段时间我都没有得到正确的解决方案。

【问题讨论】:

    标签: android date datetime


    【解决方案1】:

    编辑:要获取月份差异,您可以使用 Calender 类。否则,请使用 JodaTime 库(链接在答案底部)。

    Calendar startCalendar = new GregorianCalendar();
    startCalendar.setTime(startDate);
    Calendar endCalendar = new GregorianCalendar();
    endCalendar.setTime(endDate);
    
    int diffYear = endCalendar.get(Calendar.YEAR) - startCalendar.get(Calendar.YEAR);
    int diffMonth = endCalendar.get(Calendar.MONTH) - startCalendar.get(Calendar.MONTH);
    int diffDay = endCalendar.get(Calendar.DAY_OF_MONTH) - startCalendar.get(Calendar.DAY_OF_MONTH);
    

    请注意,如果您的日期是 2013 年 1 月 31 日和 2013 年 2 月 01 日,那么您将获得 1 个月的距离,这可能是您想要的,也可能不是。要更正此问题,请参阅this answer

    编辑前

    只需减去日期并根据您的需要计算毫秒数

    // Start Date : 01/14/2012 09:29:58
    // End Date   : 01/15/2012 10:31:48
    
    public static void getDifference(Date d1, Date d2){
    
        // HH converts hour in 24 hours format (0-23), day calculation
        // must match with your date format
        SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
    
        try {
    
            //in milliseconds
            long diff = d2.getTime() - d1.getTime();
    
            long diffSeconds = diff / 1000 % 60;
            long diffMinutes = diff / (60 * 1000) % 60;
            long diffHours = diff / (60 * 60 * 1000) % 24;
            long diffDays = diff / (24 * 60 * 60 * 1000);
    
            System.out.print(diffDays + " days, ");
            System.out.print(diffHours + " hours, ");
            System.out.print(diffMinutes + " minutes, ");
            System.out.print(diffSeconds + " seconds.");
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    
    }
    

    你也可以使用joda-time-library,按照这个tutorial's second step来实现。

    【讨论】:

    • 假设开始日期 = 01/14/2012 09:29:58 和结束日期 = 01/5/2011 09:29:58。现在在这种情况下,我得到了很大的天数,对吗?我想要 0-30 范围内的天数。并且想要额外的字段作为月份,比如 12 个月 3 天 1 小时 1 分钟 1 秒,我想要这样。
    • 我认为您已经接近我的答案,但仍不完美。当我输入开始日期和结束日期时差将是 1 年,那么你的功能会给我 1 年和 12 个月。我想要完美的 1 年零 0 个月。
    • 只需从int diffMonth = 行中删除diffYear * 12 + 。更新了答案。
    【解决方案2】:

    你必须写这样的代码

        long different = todayDate.getTime() - meetingDate.getTime();
    
        long secondsInMilli = 1000;
        long minutesInMilli = secondsInMilli * 60;
        long hoursInMilli = minutesInMilli * 60;
        long daysInMilli = hoursInMilli * 24;
        long mothsInMilli = daysInMilli * 30;
        long yearInMilli = mothsInMilli * 12;
    
        long elapsedYear = different / yearInMilli;
        different = different % yearInMilli;
        System.out.println("--------- elapsedYear : " + elapsedYear);
    
        long elapsedMonths = different / mothsInMilli;
        different = different % mothsInMilli;
        System.out.println("--------- elapsedMonths : " + elapsedMonths);
    
        long elapsedDays = different / daysInMilli;
        different = different % daysInMilli;
        System.out.println("--------- elapsedDays : " + elapsedDays);
    
        long elapsedHours = different / hoursInMilli;
        different = different % hoursInMilli;
        System.out.println("--------- elapsedHours : " + elapsedHours);
    
        long elapsedMinutes = different / minutesInMilli;
        different = different % minutesInMilli;
        System.out.println("--------- elapsedMinutes : " + elapsedMinutes);
    
        long elapsedSeconds = different / secondsInMilli;
        System.out.println("--------- elapsedSeconds : " + elapsedSeconds);
    

    【讨论】:

    • 每个月没有30天。有些月份也有 28 天和 31 天。在这种情况下,上面的代码将无法准确计算差异。
    • 我知道,但在这种情况下,我们只有毫秒不同。所以只有毫秒我们无法指定月份有多少天,所以我们必须猜测每个月有 30 天。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    相关资源
    最近更新 更多