Java 检查日期介于两个日期之间:时间戳(毫秒)

Java 检查日期介于两个日期之间:时间戳(毫秒),java,android,sqlite,android-sqlite,Java,Android,Sqlite,Android Sqlite,我在数据库中有start\u time和end\u time列,其中包含毫秒值 开始时间>2018年2月14日星期三11:00:00(实际日期)=(数据库值) 现在,我希望所有记录的特定日期的持续时间 交货日期:2018年2月14日 案例1: Start Time : 14/02/2018 11:00 AM End Time : 14/02/2018 11:30 AM Result : Appear (30 min) Start Time : 13/02/2018 11:00 AM (star

我在数据库中有
start\u time
end\u time
列,其中包含毫秒

开始时间>2018年2月14日星期三11:00:00(实际日期)=(数据库值)

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

交货日期:2018年2月14日

案例1:

Start Time : 14/02/2018 11:00 AM
End Time : 14/02/2018 11:30 AM
Result : Appear (30 min)
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)
Start Time : 14/02/2018 11:00 AM
End Time : 15/02/2018 11:30 AM (end date change)
Result : Appear (13 hour)
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)
案例2:

Start Time : 14/02/2018 11:00 AM
End Time : 14/02/2018 11:30 AM
Result : Appear (30 min)
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)
Start Time : 14/02/2018 11:00 AM
End Time : 15/02/2018 11:30 AM (end date change)
Result : Appear (13 hour)
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)
案例3:

Start Time : 14/02/2018 11:00 AM
End Time : 14/02/2018 11:30 AM
Result : Appear (30 min)
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)
Start Time : 14/02/2018 11:00 AM
End Time : 15/02/2018 11:30 AM (end date change)
Result : Appear (13 hour)
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)
案例4:

Start Time : 14/02/2018 11:00 AM
End Time : 14/02/2018 11:30 AM
Result : Appear (30 min)
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)
Start Time : 14/02/2018 11:00 AM
End Time : 15/02/2018 11:30 AM (end date change)
Result : Appear (13 hour)
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
query获取所有记录

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

使用

  input date = 14/02/2018;
使用以下变量
一天的开始
一天的结束

  // 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))
WHERE NOT((开始时间结束日期))

首先,将Unix历元后的毫秒转换为日期和时间取决于时区。您给出的样本值对应于UTC中2月14日上午5:30的时间。既然您将其转换为上午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);
}
我用你问题中的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
?是的,您可以,它至少需要Java6

  • 在Java8和更高版本以及现代Android设备上,
    Java.time
    内置
  • 在Java6和Java7中,获取三个后端口,即新类的后端口(三个用于JSR310,其中最早描述了现代API)
  • 在较旧的Android上,使用Android版本的ThreeTen Backport。它叫ThreeTenABP。确保从package
    org.threeten.bp
    和子package导入日期和时间类
不过,我在演示中使用的
toMinutesPart
方法仅在Java9中引入。在早期的Java和Backport中,您仍然可以使用
toMinutes()
获取
Duraiotn
Duration中的总分钟数。toString()
将以ISO 8601格式告诉您小时数和分钟数,例如
PT11H30M
为11小时30分钟

链接
  • ,解释如何使用
    java.time
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

Just use在WHERE子句中使用LIKE运算符搜索日期中的指定模式column@boobalangnanasekaran开始时间>2018年2月14日星期三11:00:00(实际日期)=1518586200000(数据库值),对于任何检索到的记录,
持续时间(以毫秒为单位)<代码>持续时间=最小值(天的结束,时间的结束)-最大值(天的开始,时间的开始)
获得案例1和案例3的高持续时间。案例2工作罚款。如果查询案例1中有帮助,我可以为“结束-开始”之间的总持续时间再添加一列:
开始时间:14/02/2018 11:00 AM结束时间:14/02/2018 11:30 AM
开始日期=14/02/2018 00:00 AM结束日期=15/02/2018 00:00 a.m`
持续时间=MIN(结束日期,结束时间)-最大(开始日期,开始时间)=MIN(2018年2月15日00:00上午,2018年2月14日11:30上午)-最大值(2018年2月14日00:00上午,2018年2月14日11:00上午)=2018年2月14日11:30上午-2018年2月14日11:00上午=30分钟。
我看不到任何问题,我将正确检查所有情况并让您知道:)您的功能应该看起来不错,但不知道为什么不在查询中工作,可能存在数据类型问题,我有VARCHAR作为duration列。