2017-10-17 140 views
1

我正在使用Java 8。在我的一个Web服务中,我得到这样的日期格式:2017-10-17T04:11:51+00:00如何检查日期和时间戳是20分钟之前

我想测试时间戳是否是20分钟前。为此我写了下面的代码,但它不工作:

Long minutesAgo = new Long(20); 
String lastDate = "2017-10-17T04:11:51+00:00"; 
OffsetDateTime odt = OffsetDateTime.parse(lastDate); 
Instant instant = odt.toInstant(); // Instant is always in UTC. 
java.util.Date date = java.util.Date.from(instant); 
Date dateIn_X_MinAgo = new Date (date.getTime() - minutesAgo*60*1000); 
System.out.println(dateIn_X_MinAgo.getTime()); //It prints 1508212311000 

有人可以看看我的代码?

+3

参见[甲骨文步道】(https://docs.oracle.com/ java.datetime'包中的javase/tutorial/datetime/index.html)。如果您有Java 8,请不要使用旧的'java.util.Date'。 –

+1

尝试使用'LocalDateTime'或'DateTime'而不是Date。在Java中,所有带有'Date'的东西都被破坏了,因为它必须是向后兼容的。 – LenglBoy

+1

请注意,“日期”现在是**遗留**,不应再使用。而是使用'java.time'包中的新东西。 – Zabuza

回答

4

您正在使用新的java.time API(OffsetDateTimeInstant),因此不需要将它与旧的java.util.Date类混合使用。

可以使用java.time.temporal.ChronoUnit获得在几分钟内2个时刻之间的差异,以及Instant.now()来获得当前时刻:

String lastDate = "2017-10-17T04:11:51+00:00"; 
OffsetDateTime odt = OffsetDateTime.parse(lastDate); 
// get difference from now (in minutes) 
long diff = ChronoUnit.MINUTES.between(odt.toInstant(), Instant.now()); 
if (diff > 20) { 
    // odt is more than 20 minutes ago 
} 
+0

感谢您的答复。我有一个愚蠢的疑问,我看到了Instant.now()中返回UTC日期的代码。所以你分享的代码将会返回正确的区别吗?因为OffsetDateTime.parse以ISO_OFFSET_DATE_TIME格式返回日期 – VelNaga

+2

@VelNaga'odt.toInstant()'转换为'Instant',因此最后比较2个瞬间。日期没有格式,它们只保留值 - 解析后,'OffsetDateTime'只保留值,但不知道用来创建它的格式是什么 - 格式与时间之间的差异无关 – 2017-10-17 13:53:31

+0

@VelNaga是的,无论用于创建日期的格式如何,代码都会返回适当的差异。 – 2017-10-17 13:54:31

相关问题