2010-12-03 2 views

답변

51

하나 :

Date date = new Date(System.currentTimeMillis() - (4 * 60 * 60 * 1000)); 

이 그러나 고려 DST (Daylight Saving Time)을지지 않습니다. 대안은 Calendar입니다.

Calendar calendar = Calendar.getInstance(); 
calendar.add(Calendar.HOUR_OF_DAY, -4); 
Date date = calendar.getTime(); 

그러나 이것은 꽤 못생긴 API입니다. 대안은 JodaTime입니다 :

DateTime dateTime = new DateTime().minusHours(4); 
Date date = dateTime.toDate(); // If you ever need this... 
+1

왜 DST를 고려하지 않습니까? –

+2

첫 번째 방법은 작동하지만 DST * 시간대 전환 *을 고려하지 않는다고 말하는 것이 더 효과적이라고 생각합니다. +1은 JodaTime을 언급합니다. –

+4

@Thor : 런타임 중에'System # currentTimeMillis()'에 기반하여 지난 4 시간 동안 DST가 활성화/비활성화되었는지 알 수 없으므로 결과 시간이 꺼지는 위험이 따를 수 있습니다. – BalusC

2

은 4 시간 (밀리 초)을 빼 밀리 초 단위로 변환 날짜로 다시 변환합니다.

6
Calendar calendar = Calendar.getInstance(); 
calendar.add(Calendar.HOUR_OF_DAY, -4); 
calendar.getTime(); 
+2

'Calendar.HOUR'는 12 시간 (AM/PM) 기준이며 24 시간 기준이 아닙니다. 'Calendar.HOUR_OF_DAY'를 원한다. 또한'Calendar # getInstance()'팩토리를 사용하는 것이 지역별 달력을 수동으로 생성하는 것보다 선호된다. – BalusC

+0

@BalusC : 수정 됨. –

1
Calendar c =Calendar.getInstance() ; 
c.add(Calendar.HOUR,-4); 
Date d = c.getTime(); 
+0

이 경우 롤을 추가하는 것이 좋습니다. – Avrom

+0

롤 방식은 오전 4시에서 23시 59 분 사이에서만 작동합니다. 그렇지 않으면 틀린 날이 올 것입니다. – Robert

2
Calendar c = Calendar.getInstance(); 
c.add(Calendar.HOUR_OF_DAY, -4); 
java.util.Date d = c.getTime(); 
System.out.println(d); 
3

다른 답변이 정확 참조하지만 현대의 대답에 기여하고 싶습니다. 최신 솔루션은 현대 Java 날짜 및 시간 API java.time을 사용합니다.

Instant fourHoursAgo = Instant.now().minus(Duration.ofHours(4)); 
System.out.println(fourHoursAgo); 

이 단지 인쇄 :

2018-01-31T15:22:21.113710Z 

결국 Z는 시간이 UTC에 인쇄되어 있음을 나타냅니다 - 당신이 경우 UTC가 제로 오프셋 (offset). Instant 클래스는 Date의 최신 대체품이므로 계속 사용하는 것이 좋습니다. 현대의 API는 일반적으로 작업하기에 훨씬 좋고, 훨씬 깔끔하고, 훨씬 잘 설계되었습니다.

라이브러리 클래스에서 4 시간 뺄셈의 이점을 유의하십시오. 코드는 읽기 쉽고 오류가 발생하기 쉽습니다. 재미있는 상수는 없으며 독자가 올바른지 확인하기 위해 시간을 할애하지 않습니다.

이 같은 변환, 변경할 수 없습니다 또는 변경하지 않는 레거시 API를 사용할 때 예를 들어, 구식 Date 객체가 필요 할 경우

Date oldfashionedDate = Date.from(fourHoursAgo); 

링크 :Oracle Tutorial trail: Date Time. 물론 인터넷에 다른 자료도 있습니다. 검색하십시오.

+0

다음 번에는 중복 답변을 게시하는 대신 속임수로 투표를 마감하십시오. – BalusC

+0

포인트 @BalusC를 참조하십시오. 나는 그들에게 정확한 복제물을 고려해봤을 것이다. (나의 두 답변 사이에는 상당한 중복이 있지만 그것들은 동일하지 않다.) –

관련 문제