Получение текущих Годов и Месяцев приводит к появлению странных результатов
Я работаю над учебным проектом, связанным с 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. спасибо.
Ответы
Ответ 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
- 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; последнее зависит от количества месяцев в году.