两个日期的Android差异,以秒为单位

时间:2010-10-18 15:26:26

标签: android date seconds

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

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")));

通过这种方式,我可以得到良好格式的两个日期。现在,我希望在几秒钟内找到EndDateStartdate之间的差异。

有什么建议吗?谢谢。

4 个答案:

答案 0 :(得分:98)

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

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

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

编辑: -Corrend变量diffInMs的名称,它是在第二行写的diffInM(i)。

答案 1 :(得分:5)

尝试以下方法: -

    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";
        }
    }

答案 2 :(得分:4)

只是为使用Time而不是Date的其他开发人员(比如我)补充这个答案。

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));

答案 3 :(得分: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,这是现代类的backport(JSR 310的ThreeTen;请参见底部的链接)。
  • 在旧版Android上,请使用Android版的ThreeTen Backport。称为ThreeTenABP。并确保使用子包从org.threeten.bp导入日期和时间类。

链接