如何在android中的两个日期之间取得差异?,尝试过每一件事并发布

Ale*_*ian 31 java time android date

我在这里看到了所有的帖子,但我仍然无法想象如何在两个android日期之间找到差异.

这就是我做的:

long diff = date1.getTime() - date2.getTime();
Date diffDate = new Date(diff);
Run Code Online (Sandbox Code Playgroud)

我明白了:日期是1970年1月1日,时间总是在两个小时内变大......我来自以色列所以两个小时就是时间.

我怎样才能得到正常的差异?

Dan*_*n F 86

你接近正确的答案,你得到这两个日期之间的毫秒差异,但是当你试图用这个差异构建一个日期时,它假设你想要创建一个Date具有该差异值的新对象作为其纪元时间.如果你正在寻找一个小时的时间,那么你只需要做一些基本的算术diff来获得不同的时间部分:

long diff = date1.getTime() - date2.getTime();
long seconds = diff / 1000;
long minutes = seconds / 60;
long hours = minutes / 60;
long days = hours / 24;
Run Code Online (Sandbox Code Playgroud)

所有这些数学运算只会进行整数运算,因此会截断任何小数点


Dud*_*ude 33

    long diffInMillisec = date1.getTime() - date2.getTime();

    long diffInDays = TimeUnit.MILLISECONDS.toDays(diffInMillisec);
    long diffInHours = TimeUnit.MILLISECONDS.toHours(diffInMillisec);
    long diffInMin = TimeUnit.MILLISECONDS.toMinutes(diffInMillisec);
    long diffInSec = TimeUnit.MILLISECONDS.toSeconds(diffInMillisec);
Run Code Online (Sandbox Code Playgroud)

  • 需要 API 级别 31。 (8认同)

Shi*_*din 17

一些补充: 这里我将字符串转换为日期然后我比较当前时间.

String toyBornTime = "2014-06-18 12:56:50";
    SimpleDateFormat dateFormat = new SimpleDateFormat(
            "yyyy-MM-dd HH:mm:ss");

    try {

        Date oldDate = dateFormat.parse(toyBornTime);
        System.out.println(oldDate);

        Date currentDate = new Date();

        long diff = currentDate.getTime() - oldDate.getTime();
        long seconds = diff / 1000;
        long minutes = seconds / 60;
        long hours = minutes / 60;
        long days = hours / 24;

        if (oldDate.before(currentDate)) {

            Log.e("oldDate", "is previous date");
            Log.e("Difference: ", " seconds: " + seconds + " minutes: " + minutes
                    + " hours: " + hours + " days: " + days);

        }

        // Log.e("toyBornTime", "" + toyBornTime);

    } catch (ParseException e) {

        e.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)


Ole*_*.V. 9

java.time.Duration

使用java.time.Duration

    Duration diff = Duration.between(instant2, instant1);
    System.out.println(diff);
Run Code Online (Sandbox Code Playgroud)

这将打印类似

PT109H27M21S
Run Code Online (Sandbox Code Playgroud)

这意味着一段 109 小时 27 分 21 秒的时间。如果你想要一些更易读的东西——我会先给出 Java 9 版本,它最简单:

    String formattedDiff = String.format(Locale.ENGLISH,
            "%d days %d hours %d minutes %d seconds",
            diff.toDays(), diff.toHoursPart(), diff.toMinutesPart(), diff.toSecondsPart());
    System.out.println(formattedDiff);
Run Code Online (Sandbox Code Playgroud)

现在我们得到

4 days 13 hours 27 minutes 21 seconds
Run Code Online (Sandbox Code Playgroud)

Duration班是部分java.time现代Java的日期和时间API。这捆绑在较新的 Android 设备上。在较旧的设备上,获取 ThreeTenABP 并将其添加到您的项目中,并确保org.threeten.bp.Duration从同一包中导入您可能需要的其他日期时间类。

假设您还没有获得 Java 9 版本,您可以依次减去较大的单位以获得较小的单位:

    long days = diff.toDays();
    diff = diff.minusDays(days);
    long hours = diff.toHours();
    diff = diff.minusHours(hours);
    long minutes = diff.toMinutes();
    diff = diff.minusMinutes(minutes);
    long seconds = diff.toSeconds();
Run Code Online (Sandbox Code Playgroud)

然后你可以像上面一样格式化四个变量。

你做错了什么?

ADate代表一个时间点。它从来就不是用来表示时间和持续时间的,它不适合它。试图使这项工作最多只会导致代码混乱且难以维护。你不想那样,所以请不要。

问题:java.time 不需要 Android API 级别 26 吗?

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

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

链接

  • 我认为这是最恰当的答案。应该接受。 (2认同)

小智 5

使用Instant怎么样:

val instant1 = now()
val instant2 = now()
val diff: Duration = Duration.between(instant1, instant2)
val minutes = diff.toMinutes()
Run Code Online (Sandbox Code Playgroud)

您甚至可以使用 instant1.toString() 保存 Instant 并使用 parse(string) 解析该字符串。

如果您需要支持 Android API 级别 < 26,只需 向您的项目添加Java 8+ API 脱糖支持即可。