2015-07-30 3 views
1

У меня есть этот метод, который возвращает мне Date(), измененную одним из его «полей» (DAY, MONTH, YEAR).Обнаружить неверную дату в Calendar.set()

public static Date getDateChanged(Date date, int field, int value) { 
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date); 
    cal.set(field, value); 
    return cal.getTime(); 
} 

Однако cal.set() не может дать исключение, когда поле мы пытаемся установить не совместим с указанной даты. Таким образом, в данном случае:

Date date = new Date(); 
date = getDateChanged(date, Calendar.DAY_OF_MONTH, 29); 
date = getDateChanged(date, Calendar.MONTH, 1); // feb 

дата, в конце концов, 01/03/15, потому что Calendar.set() определяет, что февраль не может быть установлен с 29-й день, поэтому автоматически устанавливается дата на следующий возможный день (я думаю, что так работает рутина).

Это не так уж плохо, однако, в моем случае,

Я хочу, чтобы обнаружить, что дата, я пытаюсь построить невозможно, и затем начать декремента день, так что в этом случае то, что я» m пытается достигнуть 28/02/15, как я могу это сделать?

Пример:

29/02/15 ===> 28/02/15

ответ

2

Вы можете использовать cal.getActualMaximum(Calendar.DAY_OF_MONTH) найти максимальное количество дней в данном месяце для календаря экземпляра.

Таким образом, вы можете обратиться к делу, о котором вы упомянули выше.

Также смотрите ответ здесь: Number of days in particular month of particular year?

1

Можно проверить максимальное значение с getActualMaximum:

public static Date getDateChanged(Date date, int field, int value) { 
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date); 
    int maximum = calendar.getActualMaximum(field); 
    if (value > maximum) { 
     value = maximum; 
    } 
    cal.set(field, value); 
    return cal.getTime(); 
} 
1

Вы можете использовать:

public void setLenient(boolean lenient) 

Указывает, следует ли дата/интерпретация времени должна быть снисходительной. С мягкой интерпретацией такая дата, как «Февраль 942, 1996», будет рассматриваться как эквивалентная 941-й день после 1 февраля 1996. При строгом (не-доброжелательном) толковании такие даты будут причиной исключения выброшены. Значение по умолчанию является мягким.

Parameters: 
    lenient - true if the lenient mode is to be turned on; false if it is to be turned off. 
See Also: 
    isLenient(), DateFormat.setLenient(boolean) 

Таким образом, вы получите исключение, когда вы передаете что-то неправильно :)

+0

я думаю, что он не хочет исключение – VedX

+0

Он сказал: «Я хочу обнаружить, что дата, которую я пытаюсь построить, невозможна, а затем начнет декретировать день». Исключение броска - один из способов определить, что что-то невозможно. Также он может поймать его и сделать что-то другое на этом основании. – ap0calypt1c

+0

теперь дата, если не исключение (здесь 29/2/15) добавляется как (01/03/15) на следующую дату, но здесь он хочет добавить 28/2/15. @polska, пожалуйста, поправьте меня, если я ошибаюсь – VedX

0

Может быть, это решение поможет вам

public static Date getDateChanged(Date date, int field, int value) { 
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date); 
    cal.set(field, value); 
    if (field == Calendar.MONTH && cal.get(Calendar.MONTH) != value) { 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setTime(date); 
     int month = (cal.get(Calendar.MONTH) - 1) < 0 ? 0 : (cal.get(Calendar.MONTH) - 1); 
     calendar.set(Calendar.DATE, calendar.getActualMinimum(Calendar.DATE)); 
     calendar.set(Calendar.MONTH, month); 
     calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE)); 
     return calendar.getTime(); 
    } 
    return cal.getTime(); 
} 
Смежные вопросы