2010-12-03 5 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 не учитывается? – 2010-12-03 18:22:01

+2

Первый способ работы, хотя я думаю, что лучше сказать, что он не учитывает переходы времени DST *. +1 за упоминание JodaTime. – 2010-12-03 18:22:37

+4

@Thor: Потому что во время выполнения вы не знаете на основе `System # currentTimeMillis()`, был ли DST включен/отключен в течение последних 4 часов, поэтому вы можете потерять время, в течение которого вы закончите. – BalusC 2010-12-03 18:22:47

2

Преобразовать его в миллисекундах, вычесть количество миллисекунд в течение 4 часов, преобразовать его обратно в Date.

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

Другие ответы правильны, но я хотел бы внести свой вклад в современный ответ. В современном решении используется java.time, современный API дат и времени Java.

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

Это просто напечатал:

2018-01-31T15:22:21.113710Z 

Z в конце указывает на то, что время печатается в формате UTC - в UTC смещение нуля, если вы будете. Класс Instant - это современная замена Date, поэтому я рекомендую вам придерживаться ее. Современный API, как правило, гораздо приятнее в работе, поэтому он намного чище, так лучше разработан.

Обратите внимание на преимущества, позволяющие классу библиотеки сделать вычитание 4 часов для вас: код становится более понятным для чтения и менее подвержен ошибкам. Никаких смешных констант, и ни один читатель не успевает проверить, правильны ли они.

Если вы сделать нужно старомодный Date объект, например, при использовании устаревшего API, что вы не можете изменить или не хотят изменять, как это:

Date oldfashionedDate = Date.from(fourHoursAgo); 

Ссылка:Oracle Tutorial trail: Date Time. Конечно, есть и другие ресурсы в Интернете, пожалуйста, ищите.

Смежные вопросы