-1

我正在使用 Java 并遍历 DB 列,这反过来给了我日期和时间字符串,如下所示:

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

如果我在此结果集上进行迭代,我将获得格式如下所示的 dateTime 值。

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

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

我试过了

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

那没有用。还有什么想法吗?

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

4

2 回答 2

3

java.time

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

该类Instant表示 UTC 时间线上的一个时刻,分辨率为纳秒。

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

与当前时刻前十天相比。

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

您可能不想将“十天前”基于 UTC。如果没有,请应用时区来获取ZonedDateTimeand LocalDate。这已被多次介绍,因此请搜索 Stack Overflow。想想“天”对你来说是否意味着 (a) 24 小时或 (b) 日历日期。

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

SQL

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

String sql = "SELECT * FROM tbl_ WHERE when_ < ? " ;
… make your PreparedStatement
myPreparedStatement.setObject( 1 , tenDaysAgo ) ;
… execute
于 2017-08-18T00:28:59.570 回答
3

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

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());
于 2017-08-18T00:37:03.350 回答