检查日期落在两个日期之间:时间戳(毫秒)

时间:2018-02-14 12:42:27

标签: java android sqlite android-sqlite

我在数据库中有start_timeend_time列,其中包含毫秒值。

start_time> 2018年2月14日星期三11:00:00 (实际日期)= 1518586200000 (数据库值)

现在我希望特定日期的所有记录都有持续时间。

实施例。日期:2018年2月14日

案例1:

Start Time : 14/02/2018 11:00 AM
End Time : 14/02/2018 11:30 AM
Result : Appear (30 min)

案例2:

Start Time : 13/02/2018 11:00 AM (start date change)
End Time : 14/02/2018 11:30 AM
Result : Appear (11 hour 30 min)

案例3:

Start Time : 14/02/2018 11:00 AM
End Time : 15/02/2018 11:30 AM (end date change)
Result : Appear (13 hour)

案例4:

Start Time : 13/02/2018 11:00 AM (start date change)
End Time : 16/02/2018 11:30 AM (end date change)
Result : Appear (24 hour)

是否可以使用sqlite查询获取所有记录?

注意:我不想比较当前时间,我希望所有持续时间明白日期。

2 个答案:

答案 0 :(得分:1)

使用

  input date = 14/02/2018;

使用以下变量beginning_of_dayend_of_day;

  // beginning_of_day indicates first hour of input_date
  beginning_of_day = 14/02/2018 00:00 a.m. // in millisecond format
  // end_of_day indicates end hour of input_date (or) the first hour of next valid date of input_date
  end_of_day = 15/02/2018 00:00 a.m.  // in millisecond format

然后你可以使用以下where子句;

WHERE NOT ((start_time<beginning_of_day AND end_time<beginning_of_day) OR (start_time>end_of_day AND end_time>end_of_day))

答案 1 :(得分:0)

首先,将Unix纪元以来的毫秒转换为日期和时间取决于时区。您提供的样本值对应于2月14日上午5:30(UTC)。由于您将其翻译为上午11点,看起来您的时区与UTC,Lemme guess,印度或斯里兰卡相差+05:30?

其次,我不知道这是否可以在SQLite中实现。它当然是在Java中,当你知道如何时并不困难。以下方法将完成这项工作;

public static ZoneId zone = ZoneId.of("Asia/Colombo");

public static Duration dateAppearingBetweenTimestamps(LocalDate date, long start, long end) {
    if (end < start) {
        throw new IllegalArgumentException("end must be on or after start");
    }
    Instant startOfDay = date.atStartOfDay(zone).toInstant();
    Instant startOfNextDay = date.plusDays(1).atStartOfDay(zone).toInstant();
    Instant startTime = Instant.ofEpochMilli(start);
    Instant endTime = Instant.ofEpochMilli(end);
    if (endTime.isBefore(startOfDay) || startTime.isAfter(startOfNextDay)) {
        return Duration.ZERO;
    }
    if (startTime.isBefore(startOfDay)) {
        startTime = startOfDay;
    }
    if (endTime.isAfter(startOfNextDay)) {
        endTime = startOfNextDay;
    }
    return Duration.between(startTime, endTime);
}

为了演示,我做了这个小辅助方法:

public static void demo(String start, String end) {
    long startTimestamp
            = LocalDateTime.parse(start).atZone(zone).toInstant().toEpochMilli();
    long endTimestamp
            = LocalDateTime.parse(end).atZone(zone).toInstant().toEpochMilli();
    Duration result = dateAppearingBetweenTimestamps(
            LocalDate.of(2018, Month.FEBRUARY, 14), startTimestamp, endTimestamp);
    System.out.format("%13d %16s %14d %16s = %2d hours %2d minutes%n", 
            startTimestamp, start, endTimestamp, end, result.toHours(), result.toMinutesPart());
}

我用你问题中的4个案例打电话给它:

    demo("2018-02-14T11:00", "2018-02-14T11:30");
    demo("2018-02-13T11:00", "2018-02-14T11:30");
    demo("2018-02-14T11:00", "2018-02-15T11:30");
    demo("2018-02-13T11:00", "2018-02-16T11:30");

打印出来:

1518586200000 2018-02-14T11:00  1518588000000 2018-02-14T11:30 =  0 hours 30 minutes
1518499800000 2018-02-13T11:00  1518588000000 2018-02-14T11:30 = 11 hours 30 minutes
1518586200000 2018-02-14T11:00  1518674400000 2018-02-15T11:30 = 13 hours  0 minutes
1518499800000 2018-02-13T11:00  1518760800000 2018-02-16T11:30 = 24 hours  0 minutes

在所有情况下,输出小时和分钟都符合您的预期。

我正在使用并推荐java.time,现代Java日期和时间API及其Duration类。您可以在Android上使用java.time吗?是的,你可以,它只需要至少Java 6。

  • 在Java 8及更高版本和现代Android设备java.time内置。
  • 在Java 6和7中获取ThreeTen Backport,这是新类的后端(JST 310的ThreeTen,其中首次描述了现代API)。
  • 在较旧的Android上,使用Android版的ThreeTen Backport。它被称为ThreeTenABP。确保从包org.threeten.bp和子包中导入日期和时间类。

我在演示中使用的toMinutesPart方法仅在Java 9中引入。在早期的Java和backport中,您仍然可以使用toMinutes()来获取Duraiotn中的总分钟数,Duration.toString()将告诉您ISO 8601格式的小时和分钟数,例如PT11H30M 11小时30分钟。

链接