计算ISO格式的给定时间和当前时间之间的天数



我必须找出给定时间和当前时间之间的天数。给定的时间是ISO格式;2021-01-14 16:23:46.217-06:00";。

我试过用";java.text.SimpleDateFormat";但它并没有给我准确的结果
在下面的给定日期中,对于今天的时间,我得到的输出为";633〃;不正确的天数。不知何故,在解析之后,它将日期取为"日期";2020年12月21日";这不是正确的

String TIMESTAMP_FORMAT = "YYYY-MM-DD hh:mm:ss.s-hh:mm" ;  
int noOfDays = Utility.getTimeDifferenceInDays("2021-01-14 16:23:46.217-06:00", TIMESTAMP_FORMAT);

public static int getTimeDifferenceInDays(String timestamp, String TIMESTAMP_FORMAT) {
DateFormat df = new SimpleDateFormat(TIMESTAMP_FORMAT);
try {
Date date = df.parse(timestamp);
long timeDifference = (System.currentTimeMillis() - date.getTime());
return (int) (timeDifference / (1000*60*60*24));
} catch (ParseException e) {
e.printStackTrace();
}
return 0;
}  

寻找一个更好的解决方案,给我正确的天数。感谢

使用java.time API

DateSimpleDateFormat是遗留的。

自从Java 8(10年前发布(以来,我们有了一个新的Time API,由java.time包中的类表示。

要解析和格式化数据,可以使用DateTimeFormatter。可以通过静态方法ofPattern()或使用DateTimeFormatterBuilder来获得DateTimeFormatter的实例。

  • ofPattern()
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSXXX");
  • DateTimeFormatterBuilder
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd HH:mm:ss.")       // main date-time part
.appendValue(ChronoField.MILLI_OF_SECOND, 3) // fraction part of second
.appendOffset("+HH:MM", "+00:00")            // can be substituted with appendPattern("zzz") or appendPattern("XXX")
.toFormatter();

作为示例提供的字符串"2021-01-14 16:23:46.217-06:00"包含日期-时间信息和UTC偏移量。这样的数据可以用CCD_ 11来表示。

要获得两个时间对象之间的天数,可以使用ChronoUnit.between(),因为@MC Emperor在评论中提到了这一点。

这就是整个代码的样子:

String toParse = "2021-01-14 16:23:46.217-06:00";


OffsetDateTime dateTime = OffsetDateTime.parse(toParse, formatter);
System.out.println("parsed date-time: " + dateTime);

Instant now = Instant.now();

long days = ChronoUnit.DAYS.between(dateTime.toInstant(), now);
System.out.println("days: " + days);

输出:

parsed date-time: 2021-01-14T16:23:46.217-06:00
days: 615

请注意由于在这种情况下,您只需要当前日期之间的天数差异,而不是OffsetDateTime,因此可以使用LocalDateTime,因此在分析字符串时将忽略UTC偏移量。如果您决定这样做,那么传递给ChronoUnit.between()的第二个参数也应该是LocalDateTime类型。

相关内容

  • 没有找到相关文章

最新更新