如何计算剩余天数?

时间:2015-07-20 15:45:51

标签: java date datetime

private long calculateNextBirthday() {

    final Calendar c = Calendar.getInstance();

    c.set(2015, 8, 20);
      //this is birthdate. set it to date you get from date picker

    final Calendar today = Calendar.getInstance();

    long eta = c.getTimeInMillis();
    long now = System.currentTimeMillis();

    long durationMills = eta - now;

    long diffSeconds = durationMills / 1000;
    long diffMinutes = diffSeconds / 60;
    long diffHours = diffMinutes / 60;
    long diffDays = diffHours / 24;
    long remainDays = diffHours % 24;


    final long millis = c.getTimeInMillis()
            - today.getTimeInMillis();

    // Convert to days
    final long days = millis / 86400000; // Precalculated
    // (24 *
    // 60 *
    // 60 *
    // 1000)

    return diffDays;
}

此方法应该计算给定日期的剩余天数,但是 我不知道为什么这不会返回确切的值。我认为这应该返回 30 31 ,但我得到 62

修改

我改变了我的代码,但我仍然没有得到确切的值:

private long calculateRemainingDays() {

    final Calendar c = Calendar.getInstance();
    c.set(2015, 7, 23);
    final Calendar today = Calendar.getInstance();

    final long millis = c.getTimeInMillis()
            - today.getTimeInMillis();
    // Convert to days
    final long days = millis / 86400000;
    return days;
}

3 个答案:

答案 0 :(得分:2)

你得到的是正确的,当你使用8月你实际使用9月时,它被索引为0.最好使用内置常量,如Calendar.AUGUST,即7。 / p>

答案 1 :(得分:1)

您可以使用日期算术(Date API减去DAYS.convert())代替使用自己的代码来查找差异。用于填充fromDatetoDate我在此使用的SimpleDateFormat。您可以通过其他方式填充Date。但主要的是你需要两个Date才能找到差异。

SimpleDateFormat dateFormat = new SimpleDateFormat("dd MM yyyy");
String date1 = "20 05 1985";
String date2 = "22 05 1999";

try {
    Date toDate = dateFormat.parse(date2);
    Date fromDate = dateFormat.parse(date1);
    long diff = toDate.getTime() - fromDate.getTime();
    System.out.println ("Difference in Days: " + TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS));
} catch (ParseException e) {
    e.printStackTrace();
}

答案 2 :(得分:1)

已经有两个答案可以解释为什么OP的原始代码不起作用或者如何使用java.util.Date来解决他的问题。

我想添加带有java.time的Java 8版本,以便使用更新的API显示更“现代”的方法。

calculateRemainingDays方法可能如下所示:

private long calculateRemainingDays(final Temporal target) {
    final LocalDate today = LocalDate.now();
    return today.until(target, ChronoUnit.DAYS);
}

获取目标Temporal并计算今天的天数差异。

可以像这样调用此方法:

final LocalDate target = LocalDate.of(2015, 8, 23);
System.out.println(calculateRemainingDays(target));

第一行为2015年8月的23 rd 创建LocalDate(*)并将其传递给计算方法。结果将打印为(“现在”为2015年7月的20 th ):

  

34

请注意,如果target日期 today之前的,结果将为负数。

(*)注意,与Calendar不同,LocalDate中的月份不是从零开始的,因此 8 表示“八月”而不是“九月”。

LocalDate.of(int, int, int)的JavaDoc片段:

  

公共静态LocalDate(int year,int month,int dayOfMonth)

     

参数:
   - 代表的年份,从MIN_YEAR到MAX_YEAR
   - 表示从1(1月)到12(12月)的年份    dayOfMonth - 表示的日期,从1到31

如果有人不确定如何使用此方法并且可能会对此问题和Calendar版本感到困惑,那么他可以使用LocalDate.ofJavaDoc)的重载版本:< / p>

final LocalDate target = LocalDate.of(2015, Month.AUGUST, 24);

这会从Month枚举中获取一个值,因为它会显示月份的名称,所以不会对此产生混淆。