2013-02-13 4 views
2

Предположим, у меня есть объект даты, обозначенный 13 февраля 2013 года в 11 вечера. Я пытаюсь получить следующий объект в ближайшее время, скажем, 3 часа ночи. Так что в этом случае это будет 14 февраля 2013 года 3 часа ночи.Как найти скорую Java-дату за полночь?

Я мог бы это сделать, просто добавив 1 день в поле даты и установки времени до 3:00 утра, но то, что о следующем случае:

У меня есть объект даты, отмеченные для 14 февраля 2013 года в 1am , Здесь мне не нужно было бы добавлять день, а просто задавать время.

Есть ли элегантный способ сделать это? Ниже приводится то, что я сделал до сих пор, и я думаю, что это сработает, но мне просто интересно, есть ли там api, что делает это проще. Что-то вроде getNextSoonestDate() или что-то

Calendar calendar = Calendar.getInstance(); 

//myDate is some arbitrary date, like one of the examples posted above (i.e. feb 13th 11pm) 
calendar.setTime(myDate); 

//set the calender to be 3am 
calendar.set(Calendar.HOUR_OF_DAY, 3); 

//check if this comes before my current date, if so we know we need to add a day 
if (calendar.getTime().before(myDate)){ 
    calendar.add(Calendar.DAY_OF_YEAR, 1); 
} 
+0

ваш код не будет работать в 02: 00ч – AlexWien

+0

@AlexWien - почему нет? – radai

+0

уверен, что это было бы, 3 часа не было бы до 2 утра, поэтому мы бы оставили день года нетронутым – 75inchpianist

ответ

3

Я не думаю, что есть предварительно написанный метод, чтобы делать то, что вы хотите сделать, но писать метод утилиты достаточно прост.

С учетом сказанного, ваш код близко, но не будет работать должным образом, если myDate между 3:00:00.001 и 3:59:59.999 (я предполагаю, что вы хотите, чтобы вернуть появление на следующий день в данном случае) - вам необходимо обнулить из менее значимых полей:

public static Date getNextTime(Date base, int hourOfDay) { 
    Calendar then = Calendar.getInstance(); 
    then.setTime(base); 
    then.set(Calendar.HOUR_OF_DAY, hourOfDay); 
    then.set(Calendar.MINUTE, 0); 
    then.set(Calendar.SECOND, 0); 
    then.set(Calendar.MILLISECOND, 0); 
    if (then.getTime().before(base)) { 
     then.add(Calendar.DAY_OF_YEAR, 1); 
    } 
    return then.getTime(); 
} 

Date nextOccurrenceOf3am = getNextTime(myDate, 3); 
2

Проверить час дня текущая дата (дата прошло) и выяснить, если оно больше или равно 3, если да, принять следующую дату. Иначе сегодня .. не так ли? Это может не дать результат, если вы хотите точно такую ​​же дату точно в 3:00:00.

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