Почему Calendar.JUNE устанавливает месяц на июль?

Я полагаю, что некоторые из вас прочитали заголовок и подумали: «О, еще один вопрос о системе месяца в Java, основанной на 0 ...». Ну, не в этот раз.

После того, как мы перешли на летнее время, мой объект календаря Java ведет себя неадекватно. Установка месяца на ИЮНЬ фактически устанавливает его на июль. Я понятия не имею, почему, но кто-то предложил мне установить объект Locale в параметрах конструктора календаря. Это не сработало. Следующий код возвращает 01-07-14 в моей консоли.

Любые идеи?

public class test {

    public static void main(String[] args){
        Locale locale = new Locale("da-DK");
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yy");

        Calendar date = new GregorianCalendar(locale);
        date.set(Calendar.MONTH, Calendar.JUNE);
        System.out.println(sdf.format(date.getTime()));
    }
}

ОБНОВЛЕНИЕ:

это также возвращает 01-07-14

public class test {

    public static void main(String[] args){
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yy");
        TimeZone timeZone = TimeZone.getTimeZone("Europe/Copenhagen");

        Calendar date = new GregorianCalendar(timeZone);
        date.set(Calendar.MONTH, Calendar.JUNE);
        System.out.println(sdf.format(date.getTime()));
    }
}

person jumps4fun    schedule 31.03.2014    source источник
comment
Чтобы правильно обрабатывать DST, вам нужно указать коду, какой TimeZone использовать.   -  person nablex    schedule 31.03.2014
comment
Под переходом на летнее время вы имеете в виду первый раз или обычное явление в это время года?   -  person Gilbert Le Blanc    schedule 31.03.2014
comment
Это регулярное явление каждый год, но это первый раз, когда у меня есть система, на которую это влияет. Это было сделано менее полугода назад, так что это первый случай с тех пор.   -  person jumps4fun    schedule 31.03.2014
comment
@nablex спасибо за предложение. К сожалению, это не сработало.   -  person jumps4fun    schedule 31.03.2014


Ответы (2)


Сегодня 31 марта. Когда вы устанавливаете месяц календаря, текущий день остается установленным, но 31 июня не существует, поэтому Calendar переносится на 1 июля.

person Mark Rotteveel    schedule 31.03.2014
comment
ДА! Конечно! Я должен был знать. Как удобно, что это произошло сразу после того, как мы перешли на летнее время, чтобы еще больше меня запутать. Большое спасибо! Я обязательно установлю день на 1, прежде чем что-либо делать с месяцем :) - person jumps4fun; 31.03.2014
comment
Побей меня в пух и прах, date.set(Calendar.DAY_OF_MONTH, 1); все исправляет ;) - person Gorbles; 31.03.2014
comment
... и это именно то, что я сделал сейчас ;). Спасибо ребята. Действительно спасибо. Вы сэкономили мне, вероятно, пару разочаровывающих часов на этом. - person jumps4fun; 31.03.2014

Вам нужно создать свой GregorianCalendar, используя соответствующий Locale

http://docs.oracle.com/javase/7/docs/api/java/util/GregorianCalendar.html#GregorianCalendar(java.util.Locale)

person Scary Wombat    schedule 31.03.2014
comment
Это ничего не сделало. Сейчас я обновлю и упрощу свой код для получения дополнительной информации. - person jumps4fun; 31.03.2014