Установка значений в календаре (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
- Проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше) специально для Android.
- Смотрите Как использовать ThreeTenABP….
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь, такие как Interval
, YearWeek
, YearQuarter
и многое другое.