我必须找出给定时间和当前时间之间的天数。给定的时间是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
类Date
和SimpleDateFormat
是遗留的。
自从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
类型。