首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查日期介于两个日期之间:时间戳(毫秒)

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

Stack Overflow用户
提问于 2018-02-14 12:42:26
回答 2查看 103关注 0票数 0

我在数据库中有带有start_timeend_time列的毫秒值。

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

现在,我要所有的记录,在特定的一天的持续时间。

例如。日期:2018年2月14日

案例1 :

代码语言:javascript
运行
复制
Start Time : 14/02/2018 11:00 AM
End Time : 14/02/2018 11:30 AM
Result : Appear (30 min)

案例2 :

代码语言:javascript
运行
复制
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 :

代码语言:javascript
运行
复制
Start Time : 14/02/2018 11:00 AM
End Time : 15/02/2018 11:30 AM (end date change)
Result : Appear (13 hour)

案例4 :

代码语言:javascript
运行
复制
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查询获取所有记录?

注意:我不想比较当前的时间,我希望所有的持续时间都是明智的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-14 13:01:02

使用

代码语言:javascript
运行
复制
  input date = 14/02/2018;

使用以下变量beginning_of_dayend_of_day

代码语言:javascript
运行
复制
  // 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子句;

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2018-02-15 02:20:52

首先,从Unix时代到日期和时间的毫秒转换取决于时区。你给出的样本值对应于世界协调时凌晨5:30的2月14日。既然你把它翻译成上午11点,你的时区似乎是从世界协调时,莱姆猜测,印度或斯里兰卡的偏移+05:30?

其次,我不知道这在SQLite中是否可行。它当然是用Java编写的,当您知道如何使用时,这并不难。下面的方法将完成这项工作;

代码语言:javascript
运行
复制
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);
}

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

代码语言:javascript
运行
复制
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());
}

我用你问题中的四个案例来说明这一点:

代码语言:javascript
运行
复制
    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");

印刷本:

代码语言:javascript
运行
复制
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和time及其Duration类。你能在机器人上使用java.time吗?是的,你可以,它只需要至少Java 6。

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

不过,我在演示中使用的toMinutesPart方法只是在Java9中介绍的。在早期的Java和backports中,您仍然可以使用toMinutes()获取Duraiotn中的总分钟数,Duration.toString()将以ISO 8601格式告诉您时间和分钟,例如11小时30分钟的PT11H30M

链接

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48787531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档