39

我在网络上尝试了不同的方法,但无法使其工作。

Cursor cursor = sqlite.myDataBase.rawQuery("SELECT StartDate, EndDate FROM Tracks Where Id="+'"'+trackId+'"',null);

SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date startDate = outputFormat.parse(cursor.getString(cursor.getColumnIndex("StartDate")));
Date endDate = outputFormat.parse(cursor.getString(cursor.getColumnIndex("EndDate")));

通过这种方式,我得到了良好格式的两个日期。现在我想以秒为单位找出EndDate和之间的区别。Startdate

有什么建议吗?谢谢你。

4

4 回答 4

119

您可以将日期对象转换为 long(自 1970 年 1 月 1 日以来的毫秒数),然后用于TimeUnit获取秒数:

long diffInMs = endDate.getTime() - startDate.getTime();

long diffInSec = TimeUnit.MILLISECONDS.toSeconds(diffInMs);

编辑:-更正了变量 diffInMs 的名称,该名称在第二行中写为 diffInM(i)s。

于 2010-10-18T15:44:13.557 回答
6

尝试以下方法: -

    public String twoDatesBetweenTime(String oldtime)
    {
        // TODO Auto-generated method stub
        int day = 0;
        int hh = 0;
        int mm = 0;
        try
        {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date oldDate = dateFormat.parse(oldtime);
            Date cDate = new Date();
            Long timeDiff = cDate.getTime() - oldDate.getTime();
            day = (int) TimeUnit.MILLISECONDS.toDays(timeDiff);
            hh = (int) (TimeUnit.MILLISECONDS.toHours(timeDiff) - TimeUnit.DAYS.toHours(day));
            mm = (int) (TimeUnit.MILLISECONDS.toMinutes(timeDiff) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(timeDiff)));
        }
        catch (ParseException e)
        {
            e.printStackTrace();
        }
        if(day==0)
        {
            return hh + " hour " + mm + " min";
        }
        else if(hh==0)
        {
            return mm + " min";
        }
        else
        {
            return day + " days " + hh + " hour " + mm + " min";
        }
    }
于 2014-07-31T13:25:03.507 回答
5

只是为使用时间而不是日期的其他开发人员(如我)补充这个答案。

Time t1 = new Time();
t1.setToNow();
Thread.sleep(1000);

Time t2 = new Time();
t2.setToNow();

diff = TimeUnit.MILLISECONDS.toSeconds(t2.toMillis(true)-t1.toMillis(true));
于 2013-08-24T21:43:48.943 回答
2

虽然其他答案有效并且在 2010 年是很好的答案,但我提供的是现代答案。

java.time 和 ThreeTenABP

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
    ZoneId zone = ZoneId.systemDefault();

    String startDateString = "2019-12-31 23:34:45";
    String endDateString = "2020-01-01 07:56:34";

    ZonedDateTime start = LocalDateTime.parse(startDateString, formatter).atZone(zone);
    ZonedDateTime end = LocalDateTime.parse(endDateString, formatter).atZone(zone);

    long diffSeconds = ChronoUnit.SECONDS.between(start, end);

    System.out.println("Difference: " + diffSeconds + " seconds");

在大多数时区,此代码段的输出将是:

差异:30109 秒

我正在使用它是ZonedDateTime因为它考虑了夏令时 (DST) 和其他时间异常的转换。当然,它要求您使用正确的时区。如果在您将日期和时间存储到数据库后更改了设备的时区设置,您可能会遇到一些意外。为防止这种情况,您可以将 UTC 偏移量与您的时间一起存储,然后OffsetDateTime在检索时将其解析。

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

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

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

链接

于 2020-03-10T05:15:23.617 回答