Вопрос по java, date, android – Получение текущего года и месяца, приводящих к странным результатам

24

Я работаю над учебным проектом, связанным с Android. Я пытаюсь получить текущий год & amp; месяц, используя приведенный ниже код, но он не работает для меня.

<code>GregorianCalendar gc = new GregorianCalendar();
gc.YEAR // returning 1       
gc.MONTH // returning 2

Calendar c = Calendar.getInstance();
c.YEAR // returning 1       
c.MONTH // returning 2
</code>

Кто-нибудь может мне помочь? Я делаю что-то неправильно? пожалуйста, прости меня, я новичок в разработке Java. Благодарю.

Ваш Ответ

6   ответов
21

если вам нужно сопоставить это с практическими проблемами, просто добавьте + 1

int month=c.get(Calendar.MONTH)+1;
int cmonth = c.get (Calendar.MONTH); // это апрель, поэтому вы получите 3 вместо 4. Bala Vishnu
Человек, который проголосовал за мой результат ... посмотрите эту строку в принятом ответе ... чтобы сделать его совместимым с реальным месяцем, вы должны добавить 1.. В противном случае январь будет равен 0 ... Если вы не понимаете, не голосуйте. ..не -1 Bala Vishnu
+ 1, мне понадобилось полдня, чтобы понять это. Yohannis
Для правильной нумерации используйте современный подход с Java.time классы:LocalDate.now().getMonthValue() -12 1-12 за январь-декабрь. Basil Bourque
3
tl; др
YearMonth.now( 
    ZoneId.of( "America/Montreal" ) 
)
Детал

Ответ от Джона Скита правильно. Вы обращались к константам, а не опрашивали свой собственный объект.

Здесь совершенно другая альтернатива, использующая современные классы даты и времени.

Избегайте устаревших классов даты и времени

Старые классы даты и времени, такие какjava.util.Date, java.util.Calendar, а такжеjava.text.SimpleTextFormat есть сейчас Наследство, вытесненный Java.time классы.

YearMonth

Если вы ориентированы на год и месяц без даты, без времени суток и без часового пояса, используйтеYearMonth учебный класс

Вместо того, чтобы передавать простые целые числа в течение года и месяца, передавайте объекты этого класса. Это обеспечивает безопасность типов, гарантирует допустимые значения и делает ваш код более самодокументируемым.

Определение текущего года и месяца означает определение текущей даты. И для этого часовой пояс имеет решающее значение. В любой момент времени дата меняется по всему земному шару в зависимости от зоны.

ZoneId z = ZoneId.of( "America/Montreal" );
YearMonth ym = YearMonth.now( z );

Ты можешь допросить его части.

int year = ym.getYear();
int month = ym.getMonthValue();

Этот класс предлагает удобные методы, такие как сообщение о високосном году. Вы можете сделать математику, например, сложение / вычитание месяцев / лет. Вы можете получить дату для любого дня этого года-месяца. И больше

Month

Вместо того, чтобы возиться с простым целым числом для пн, я предлагаю вам использоватьMonth enum. В этом классе заранее определены десятки экземпляров, по одному на каждый месяц года. Как упоминалось выше, использование объектов дает вам безопасность типов, допустимые значения и самодокументируемый код.

Month m = ym.getMonth();

В классе есть полезные методы, такие как создание локализованной строки с названием месяца.

О java.time

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

Joda-Time проект, теперь вРежим технического обслуживани, советует перейти на Java.time классы.

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

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

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

И то и другоеnew GregorianCalendar() а такжеCalendar.getInstance() правильно выдаст календарь, инициализированный на текущую дату и время.

MONTH а такжеYEAR являются Константы в пределахCalendar учебный класс. Вам следуетн используйте их «через» ссылку, которая выглядит так, как будто они являются частью состояния объекта. Это неудачная часть дизайнаCalendar класс, чтобы получить доступ к значениям разных полей, нужно позвонитьget с номером поля, указанным в качестве одной из этих констант, как показано в других ответах:

Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);

Обратите внимание, что номера месяцев начинаются с 0, поэтому на момент написания этой статьи (в апреле) номер месяца будет равен 3.

Это неудачная часть дизайна языка Java, которую выможе ссылаться на статические члены (такие как константы) через выражения этого типа, а нетольк через имя типа.

Мои рекомендации:

Если ваша IDE разрешает это (как это делает Eclipse), создайте такие выражения, какc.YEAR выдайте ошибку во время компиляции - вы получите гораздо более понятный код, если будете всегда использоватьCalendar.YEAR. Где возможно, используйтеJoda Time - гораздо лучшая библиотека даты / времени для Java. По общему признанию на Android вы можете быть немного ограничены в пространстве, но если ваше приложение выполняет много манипуляций с датой и временем, это избавит вас от многих головных болей.
@ YaqubAhmad: С удовольствием - два других ответа былиправильны, но я чувствовал, что они могли бы сделать с немного большим объяснением Jon Skeet
2
Calendar c= Calendar.getInstance()
int cyear = c.get(Calendar.YEAR);//calender year starts from 1900 so you must add 1900 to the value recevie.i.e., 1990+112 = 2012
int cmonth = c.get(Calendar.MONTH);//this is april so you will receive  3 instead of 4.
int cday = c.get(Calendar.DAY_OF_MONTH);

ССЫЛК

5
int year=c.get(Calendar.YEAR);
int month=c.get(Calendar.MONTH);

   System.out.println(year);
   System.out.println(month);
FYI, c.get (Calendar.MONTH) - это нулевой индекс месяцев. Yohannis
1
Как узнать текущий год и месяц.
        Calendar calendar = Calendar.getInstance();             
        int month = calendar.get(Calendar.MONTH) + 1;
        int year = calendar.get(Calendar.YEAR);

чтобы получить правильный месяц, потому что значение первого месяца 0:

        int month = calendar.get(Calendar.MONTH) + 1;

МЕСЯ: Номер поля для получения и установки с указанием месяца. Это значение для календаря. Первый месяц года в григорианском и юлианском календарях - ЯНВАРЬ, который равен 0; последнее зависит от количества месяцев в году.

большое спасиб tej shah
Этот ужасный класс Calendar был вытеснен несколько лет назад классами java.time с принятием JSR 310. Современный подход:LocalDate.now().getMonthValue() Basil Bourque

Похожие вопросы