如何查找超过 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 为基础。如果不是,请应用时区以获得 ZonedDateTime
和 LocalDate
。这已被多次提及,因此请搜索 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 ZonedDateTime
和 DateTimeFormatter
API,您可以简单地执行以下操作:
dates = dates.stream()
.map(ZonedDateTime::parse)
.filter(z -> z.isAfter(ZonedDateTime.now().minusDays(10L)))
.map(ZonedDateTime::toString)
.collect(Collectors.toList());
System.out.println(dates); // [2017-08-14T22:22:40.340772396Z]
更新
@Basil 和@shmosel 在他们下面的评论中提出了一个有效的观点,检查,它现在的实现方式,检查 now()
对每个字符串(这个 now()
对于任何这样的比较都是不同的) .
如果我们想检查相同的特定时间点,我们应该 "freeze" now()
对照所有字符串,一个很好的方法(感谢@shmosel 的建议)将是创建 now()
的单个实例并使用其方法参考:
ZonedDateTime.now().minusDays(10)::isAfter
或:
ZonedDateTime tenDaysAgo = ZonedDateTime.now().minusDays(10L);
dates = dates.stream()
.map(ZonedDateTime::parse)
.filter(z -> z.isAfter(tenDaysAgo))
.map(ZonedDateTime::toString)
.collect(Collectors.toList());
我正在使用 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 为基础。如果不是,请应用时区以获得 ZonedDateTime
和 LocalDate
。这已被多次提及,因此请搜索 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 ZonedDateTime
和 DateTimeFormatter
API,您可以简单地执行以下操作:
dates = dates.stream()
.map(ZonedDateTime::parse)
.filter(z -> z.isAfter(ZonedDateTime.now().minusDays(10L)))
.map(ZonedDateTime::toString)
.collect(Collectors.toList());
System.out.println(dates); // [2017-08-14T22:22:40.340772396Z]
更新
@Basil 和@shmosel 在他们下面的评论中提出了一个有效的观点,检查,它现在的实现方式,检查 now()
对每个字符串(这个 now()
对于任何这样的比较都是不同的) .
如果我们想检查相同的特定时间点,我们应该 "freeze" now()
对照所有字符串,一个很好的方法(感谢@shmosel 的建议)将是创建 now()
的单个实例并使用其方法参考:
ZonedDateTime.now().minusDays(10)::isAfter
或:
ZonedDateTime tenDaysAgo = ZonedDateTime.now().minusDays(10L);
dates = dates.stream()
.map(ZonedDateTime::parse)
.filter(z -> z.isAfter(tenDaysAgo))
.map(ZonedDateTime::toString)
.collect(Collectors.toList());