Установка значений в календаре (java.util.Calendar)

Я изучаю класс Calendar в Java и не могу понять Set(Calendar.Day OF MONTH) метод.

Здесь это идет:

import java.util.Calendar;  
import java.util.Date


public class TestCalender
{

 public static void main(String[] args)
    {

        Calendar cal = Calendar.getInstance();
        Date date= cal.getTime();
        System.out.println(date);
        cal.set(Calendar.DAY_OF_MONTH,33);
        //cal.set(Calendar.MONTH,13);------>(1)
        Date newdate = cal.getTime();
        System.out.println(newdate);

Выход:

Fri May 12 17:30:50 CDT 2017  
Fri Jun 02 17:30:50 CDT 2017

Когда я раскомментирую оператор (1), вывод изменится на:

Fri May 12 17:33:22 CDT 2017  
Mon Mar 05 17:33:22 CST 2018

Вот мой вопрос:

Я понял, как меняется Месяц на Март, но я не могу понять, почему дата изменилась на 5. Как я понимаю, не следует менять дату на 02 апреля 2018 года (когда 33 дня марта рассчитываются с Март имеет только 31 день, отсчет переходит на апрель месяц).

Я буду чрезвычайно признателен, если кто-то может помочь в устранении этого сомнения.

Заранее спасибо.

С уважением Рупа

2 ответа

Решение

Calendar класс использует месяцы, начинающиеся с 0 и заканчивающиеся на 11 в декабре. Поэтому, когда вы устанавливаете месяц на 13, вы указали февраль следующего года, а "33-й день февраля" (который имеет 28 дней) - 5 марта.

Классы java.util.date причудливы и сложны в использовании. Вместо этого используйте java.time.

Я учу урок календаря

Не.

Calendar класс, как известно, хлопотный, плохо продуманный, запутанный и ущербный. Теперь наследие. Заменены классами java.time. Мы можем смести этот класс в мусорную корзину истории Java.

Среди его многих проблем, Calendar использует сумасшедший месяц номер 0-11 для января-декабря. Этот факт был правильно описан в правильном ответе Кириаку. В отличие от этого, классы java.time в январе-декабре используют вменяемую нумерацию 1-12; увидеть Month ENUM.

Не совсем уверен, что ваша цель в этом фрагменте кода, но вы, кажется, добавляете 33 дня к дате.

LocalDate класс представляет значение только для даты без времени суток и без часового пояса.

Одно большое различие между java.time и унаследованными классами заключается в том, что современные классы используют неизменяемые объекты. Таким образом, добавление дней к дате приводит к созданию нового объекта даты со значениями, основанными на исходном объекте, в то время как исходный объект остается нетронутым. Это позволяет избежать путаницы и делает их поточно-ориентированными.

LocalDate ld = LocalDate.of( 2017 , Month.MARCH , 23 ) ;
LocalDate later = ld.plusDays( 33 );

О java.time

Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые классы даты и времени, такие как java.util.Date, Calendar & SimpleDateFormat,

Проект Joda-Time, находящийся сейчас в режиме обслуживания, рекомендует перейти на классы java.time.

Чтобы узнать больше, смотрите Oracle Tutorial. И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310.

Где взять классы java.time?

  • Java SE 8, Java SE 9 и более поздние
    • Встроенный.
    • Часть стандартного Java API со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport.
  • Android

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь, такие как Interval, YearWeek, YearQuarter и многое другое.

Другие вопросы по тегам