如何查找超过 10 天的日期值

How to find date values which are more than 10 days old

我正在使用 Java 并迭代 D.B。 return 中的列给我日期和时间字符串,如下所示:

String dateTime = resultSet.getSeries().get(0).getValues().get(0).get(0);

如果我迭代此结果集,我将获得格式如下所示的日期时间值。

2017-07-20T19:21:37.987792408Z
2017-04-24T22:04:26.808753375Z
2017-08-14T22:22:40.340772396Z
2017-06-24T22:24:32.422544491Z
2017-07-31T22:27:05.893368615Z

在这些记录中,我如何将日期字符串与 "current" 日期对象进行比较并丢弃那些超过 10 天的值?

我试过了

Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(s);

那没用。还有其他想法吗?

编辑: 我正在使用 Java7 并使用在查询时不提供 sysdate 列的 InfluxDB。所以我必须想出使用 Java.

的解决方案

java.time

将日期时间值检索为日期时间对象,而不是字符串。

Instant class 表示 UTC 时间轴上的一个时刻,分辨率为纳秒。

Instant instant = myResultSet.getObject( … , Instant.class ) ;

与当前时刻前十天相比。

Instant now = Instant.now() ;
Instant tenDaysAgo = now.minus( 10 , ChronoUnit.DAYS ) ;
Boolean prior = instant.isBefore( tenDaysAgo ) ;

您可能不想 "ten days ago" 以 UTC 为基础。如果不是,请应用时区以获得 ZonedDateTimeLocalDate。这已被多次提及,因此请搜索 Stack Overflow。想一想 "days" 对您来说是否意味着 (a) 24 小时或 (b) 日历日期。

仅供参考,这些字符串恰好采用标准 ISO 8601 格式。 T 将日期部分与时间部分分开。 Z 是 Zulu 的缩写,表示 UTC。此 Instant class 在其 toString 方法中使用相同的格式。

SQL

通常,您应该在数据库中作为 SQL 查询的一部分而不是在您的 Java 应用程序中进行此类比较工作。数据库针对这项工作进行了高度调整;你的应用程序不是。

String sql = "SELECT * FROM tbl_ WHERE when_ < ? " ;
… make your PreparedStatement
myPreparedStatement.setObject( 1 , tenDaysAgo ) ;
… execute

假设 dates 是代表日期的字符串列表,例如在您的示例中,使用 Java 8 ZonedDateTimeDateTimeFormatter API,您可以简单地执行以下操作:

dates = dates.stream()
        .map(ZonedDateTime::parse)
        .filter(z -> z.isAfter(ZonedDateTime.now().minusDays(10L)))
        .map(Zon‌​edDateTime::toString‌​)
        .collect(Collectors.toList());

System.out.println(dates);  // [2017-08-14T22:22:40.340772396Z]

更新
@Basil 和@shmosel 在他们下面的评论中提出了一个有效的观点,检查,它现在的实现方式,检查 now() 对每个字符串(这个 now() 对于任何这样的比较都是不同的) .

如果我们想检查相同的特定时间点,我们应该 "freeze" now() 对照所有字符串,一个很好的方法(感谢@shmosel 的建议)将是创建 now() 的单个实例并使用其方法参考:

ZonedDateTim‌​e.now().minusDays(10‌​)::isAfter

或:

ZonedDateTime tenDaysAgo = ZonedDateTime.now().minusDays(10L);
dates = dates.stream()
        .map(ZonedDateTime::parse)
        .filter(z -> z.isAfter(tenDaysAgo))
        .map(Zon‌​edDateTime::toString)
        .collect(Collectors.toList());