Android计算两个日期之间的天数

deb*_*low 11 java datetime android date kotlin

我写了以下代码来查找两个日期之间的日期

    startDateValue = new Date(startDate);
    endDateValue = new Date(endDate);
    long diff = endDateValue.getTime() - startDateValue.getTime();
    long seconds = diff / 1000;
    long minutes = seconds / 60;
    long hours = minutes / 60;
    long days = (hours / 24) + 1;
    Log.d("days", "" + days);
Run Code Online (Sandbox Code Playgroud)

当开始和结束日期分别为2017年2月3日和2017年3月3日时,显示的天数为29.虽然它们在同一天显示为1.(一天休假的天数.所以如果一个人休一天假,他必须选择相同的开始和结束日期.所以在这种情况下他休假了两天).

我究竟做错了什么?感谢您的时间.

Sac*_*wgi 25

您生成日期对象的代码:

Date date = new Date("2/3/2017"); //deprecated
Run Code Online (Sandbox Code Playgroud)

你得到28天作为答案,因为根据Date(String)构造函数它认为day = 3,month = 2和year = 2017

您可以将String转换为Date,如下所示:

String dateStr = "2/3/2017";
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date date = sdf.parse(dateStr);
Run Code Online (Sandbox Code Playgroud)

使用上面的模板来制作Date对象.然后使用下面的代码计算两个日期之间的天数.希望这清楚这件事.

它可以如下完成:

long diff = endDateValue.getTime() - startDateValue.getTime();
System.out.println ("Days: " + TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS));
Run Code Online (Sandbox Code Playgroud)

请检查链接

如果你使用Joda Time,它会更加简单:

int days = Days.daysBetween(date1, date2).getDays();
Run Code Online (Sandbox Code Playgroud)

请检查JodaTime

如何在Java Project中使用JodaTime


Wil*_* Hu 18

科特林

以下是计算从今天到某个日期的天数的示例:

 val millionSeconds = yourDate.time - Calendar.getInstance().timeInMillis
 leftDays.text = TimeUnit.MILLISECONDS.toDays(millionSeconds).toString() + "days"
Run Code Online (Sandbox Code Playgroud)

如果要计算两天,则更改:

val millionSeconds = yourDate1.time - yourDate2.time
Run Code Online (Sandbox Code Playgroud)

应该管用。

  • `val MillionSeconds = Calendar.getInstance().timeInMillis - yourDate.time` (5认同)

小智 9

public static int getDaysDifference(Date fromDate,Date toDate)
{
if(fromDate==null||toDate==null)
return 0;

return (int)( (toDate.getTime() - fromDate.getTime()) / (1000 * 60 * 60 * 24));
}
Run Code Online (Sandbox Code Playgroud)


Ant*_*iuc 8

Android完全支持java-8?如果是,您可以简单地使用ChronoUnit

LocalDate start = LocalDate.of(2017,2,3);
LocalDate end = LocalDate.of(2017,3,3);

System.out.println(ChronoUnit.DAYS.between(start, end)); // 28
Run Code Online (Sandbox Code Playgroud)

或者同样的事情使用格式化程序

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/yyyy");
LocalDate start = LocalDate.parse("2/3/2017",formatter);
LocalDate end = LocalDate.parse("3/3/2017",formatter);

System.out.println(ChronoUnit.DAYS.between(start, end)); // 28
Run Code Online (Sandbox Code Playgroud)

  • 否 在 Android 上不可用。 (2认同)
  • 我可以确认它现在可以在 Android 上使用,*即使 API 低于 26*。您无需使用其他优秀的 ThreeTenABP,只需使用 Android 4.0 并添加一些简单的配置即可:https://developer.android.com/studio/preview/features#j8-desugar (2认同)

Ole*_*.V. 6

java.time 和 ThreeTenABP

\n\n

如果我理解正确,您需要从开始日期到结束日期的天数(包括在内)

\n\n
    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("d/M/u");\n\n    String startDate = "2/3/2017";\n    String endDate = "3/3/2017";\n\n    LocalDate startDateValue = LocalDate.parse(startDate, dateFormatter);\n    LocalDate endDateValue = LocalDate.parse(endDate, dateFormatter);\n    long days = ChronoUnit.DAYS.between(startDateValue, endDateValue) + 1;\n\n    System.out.println("Days: " + days);\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出:

\n\n
\n

天数:2

\n
\n\n

ChronoUnit.DAYS.between()为我们提供从开始日期(含)到结束日期(不含)的天数。因此,为了也包括结束日期,我们需要添加 1 天,就像您在问题中所做的那样。

\n\n

你的代码出了什么问题?

\n\n

您正在使用Date(String)构造函数。此构造函数自 1997 年以来已被弃用,因为它跨时区工作不可靠,因此不要使用它。而且它\​​xe2\x80\x99s有点神奇:至少我从来不知道我得到了什么。显然,它的2/3/2017意思是2017年2月3日,而你原本的意思是2017年3月2日。从2月3日到3月3日(含)是29天(因为2017年不是闰年)。这解释了为什么你得到 29。(如果有必要,我们可以通过文档拼写并找出为什么2/3/2017会这样解释,只有我\xe2\x80\x99d 发现这样做是毫无意义的浪费时间。)

\n\n

您可以\xe2\x80\x99t 从毫秒转换。另请注意,不仅是问题,而且许多从毫秒转换为天的答案都是不正确的。这种转换假设一天始终为 24 小时。由于夏令时 (DST) 和其他时间异常,一天并不总是 24 小时。所有这些答案都会将一天计算得太少,例如,如果夏季开始时假期跨越春季间隙春季提前。

\n\n

问题:\xe2\x80\x99t java.time 是否需要 Android API 级别 26?

\n\n

java.time 在旧版和新版 Android 设备上都能很好地工作。它只需要至少Java 6

\n\n
    \n
  • 在 Java 8 及更高版本以及较新的 Android 设备(从 API 级别 26 开始)中,现代 API 是内置的。
  • \n
  • 在非 Android Java 6 和 7 中,获取 ThreeTen Backport,即现代类的向后移植(ThreeTen for JSR 310;请参阅底部的链接)。
  • \n
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它\xe2\x80\x99s 称为ThreeTenABP。并确保从org.threeten.bp子包中导入日期和时间类。
  • \n
\n\n

链接

\n\n\n


小智 5

您使用什么日期格式?是d/M/yyyy还是M/d/yyyy

d =日,M =月,yyyy =年

(请参阅:https : //developer.android.com/reference/java/text/SimpleDateFormat.html

然后代码:

public static final String DATE_FORMAT = "d/M/yyyy";  //or use "M/d/yyyy"   

public static long getDaysBetweenDates(String start, String end) {
    SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT, Locale.ENGLISH);
    Date startDate, endDate;
    long numberOfDays = 0;
    try {
        startDate = dateFormat.parse(start);
        endDate = dateFormat.parse(end);
        numberOfDays = getUnitBetweenDates(startDate, endDate, TimeUnit.DAYS);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return numberOfDays;
}
Run Code Online (Sandbox Code Playgroud)

对于getUnitBetweenDates方法:

private static long getUnitBetweenDates(Date startDate, Date endDate, TimeUnit unit) {
    long timeDiff = endDate.getTime() - startDate.getTime();
    return unit.convert(timeDiff, TimeUnit.MILLISECONDS);
}
Run Code Online (Sandbox Code Playgroud)