Получение текущих Годов и Месяцев приводит к появлению странных результатов - программирование
Подтвердить что ты не робот

Получение текущих Годов и Месяцев приводит к появлению странных результатов

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

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

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

Может кто-нибудь мне помочь? Я делаю что-то неправильно? простите меня, я новичок в разработке java. спасибо.

4b9b3361

Ответ 1

Просто чтобы дать немного больше фона:

Оба 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 у вас может быть ограниченное пространство, но если ваше приложение выполняет много времени и времени, это сэкономит вам много головных болей.

Ответ 2

Примечание. MONTHS начинается с 0..So, если вам нужно сопоставить его с практическими проблемами, просто добавьте +1

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

Ответ 3

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

   System.out.println(year);
   System.out.println(month);

Ответ 4

TL;DR

YearMonth.now( 
    ZoneId.of( "America/Montreal" ) 
)

Подробнее

Ответа на этот вопрос Jon Skeet. Вы обращались к константам, а не к опросу своего объекта.

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

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

Старые классы времени-времени, такие как java.util.Date, java.util.Calendar и java.text.SimpleTextFormat теперь legacy, вытесненный 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 встроена в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы даты-времени, такие как java.util.Date, Calendar и SimpleDateFormat.

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

Чтобы узнать больше, см. Учебник Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация 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

Ответ 5

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);

обратитесь к LINK

Ответ 6

Как получить текущий год и месяц.

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

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

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

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