2017-10-17 10 views
1

Java 8입니다. 내 웹 서비스 중 하나에서 다음과 같은 날짜 형식을 얻고 있습니다 : 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/를 javase/tutorial/datetime/index.html)을 java.datetime 패키지에 추가합니다. Java 8을 사용하고 있다면'java.util.Date'를 사용하지 마십시오. –

+1

Date가 아닌'LocalDateTime' 또는'DateTime'을 사용하려고 시도하십시오. Java에서'Date'가있는 모든 것은 이전 버전과 호환되어야하기 때문에 깨졌습니다. – LenglBoy

+1

'Date'는 ** legacy now **이므로 더 이상 사용해서는 안됩니다. 대신'java.time' 패키지의 새로운 내용을 사용하십시오. – Zabuza

답변

4

새로운 java.time API (OffsetDateTimeInstant)를 사용하고 있으므로 이전 java.util.Date 클래스와 혼합 할 필요가 없습니다.

당신은 현재 즉시 얻을 수 Instant.now()을 분 2 순간의 차이를 얻을 수있는 java.time.temporal.ChronoUnit을 사용하고 있습니다 :

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()'는 '순간적'으로 변환되므로 결국 두 순간을 비교하게됩니다. 날짜는 형식이 없으며 값만 유지합니다. 구문 분석 후 'OffsetDateTime'은 값을 유지하지만 형식을 만드는 데 사용 된 형식이 무엇인지 알지 못합니다. 형식은 순간 간의 차이를 얻는 것과 관련이 없습니다 –

+0

@VelNaga 예, 코드는 날짜를 만드는 데 사용 된 형식에 관계없이 적절한 차이를 반환합니다. –