Получить целочисленное значение текущего года в Java

Мне нужно определить текущий год в Java как целое число. Я мог бы просто использовать java.util.Date() , но он устарел.

12 Solutions collect form web for “Получить целочисленное значение текущего года в Java”

 int year = Calendar.getInstance().get(Calendar.YEAR); 

Не уверены, соответствует ли это критериям отсутствия нового Календаря? (Почему оппозиция так поступает?)

Используя API времени Java 8 (если вы счастливы получить год в часовом поясе вашей системы по умолчанию), вы можете использовать метод Year::now :

 int year = Year.now().getValue(); 

Этот простейший (используя Календарь, извините):

  int year = Calendar.getInstance().get(Calendar.YEAR); 

Существует также новый API дат и времени JSR , а также Joda Time

Самый простой способ – получить год от Календаря.

 // year is stored as a static member int year = Calendar.getInstance().get(Calendar.YEAR); 

Если вы хотите год любого объекта даты, я использовал следующий метод:

 public static int getYearFromDate(Date date) { int result = -1; if (date != null) { Calendar cal = Calendar.getInstance(); cal.setTime(date); result = cal.get(Calendar.YEAR); } return result; } 

ТЛ; др

 ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) ) .getYear() 

Часовой пояс

Ответ Раффи Хачадуриана мудро показывает, как использовать новый пакет java.time в Java 8. Но этот ответ не может решить критическую проблему часового пояса при определении даты.

int year = LocalDate.now (). getYear ();

Этот код зависит от текущего часового пояса JVM. Зона по умолчанию используется для определения текущей даты. Помните, например, что в тот же день после полуночи в Париже дата в Монреале остается «вчера».

Таким образом, ваши результаты могут отличаться в зависимости от того, на какой машине он работает, пользователь / администратор, изменяющий часовой пояс хоста или любой Java-код в любой момент, изменяя текущее значение по умолчанию JVM. Лучше указать часовой пояс.

Кстати, всегда используйте правильные названия часовых поясов, как определено IANA . Никогда не используйте 3-4 буквенных кода, которые не являются ни стандартизированными, ни уникальными.

java.time

Пример в java.time Java 8.

 int year = ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) ).getYear() ; 

Joda времени

Некоторая идея, как описано выше, но с использованием библиотеки Joda-Time 2.7.

 int year = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).getYear() ; 

Год приращения / сокращения

Если ваша цель – прыгать в год за раз, вам не нужно извлекать номер года. И Joda-Time, и java.time имеют методы для добавления / вычитания одного года за раз. И эти методы умны, управляют летним временем и другими аномалиями.

Пример в Joda-Time 2.7.

 DateTime oneYearAgo = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).minusYears( 1 ) ; 

Если ваше приложение активно использует объекты Date и Calendar, вам действительно нужно использовать Joda Time, потому что java.util.Date изменен. java.util.Calendar имеет проблемы с производительностью при обновлении полей и неудобен для арифметики datetime.

Как некоторые люди ответили выше:

Если вы хотите использовать переменную позже, лучше используйте:

 int year; year = Calendar.getInstance().get(Calendar.YEAR); 

Если вам нужен год для просто условия, которое вам лучше использовать:

 Calendar.getInstance().get(Calendar.YEAR) 

Например, используя это в do, в то время как проверки введенного года не меньше, чем в текущем году – 200 или больше, чем в текущем году (может быть год рождения):

 import java.util.Calendar; import java.util.Scanner; public static void main (String[] args){ Scanner scannernumber = new Scanner(System.in); int year; /*Checks that the year is not higher than the current year, and not less than the current year - 200 years.*/ do{ System.out.print("Year (Between "+((Calendar.getInstance().get(Calendar.YEAR))-200)+" and "+Calendar.getInstance().get(Calendar.YEAR)+") : "); year = scannernumber.nextInt(); }while(year < ((Calendar.getInstance().get(Calendar.YEAR))-200) || year > Calendar.getInstance().get(Calendar.YEAR)); } 

Вы также можете использовать LocalDate :

 import java.time.LocalDate; //... int year = LocalDate.now().getYear(); 

Вы также можете использовать 2 метода из java.time.YearMonth (Начиная с Java 8):

 import java.time.YearMonth; ... int year = YearMonth.now().getYear(); int month = YearMonth.now().getMonthValue(); 

Вы можете сделать все это с помощью математики Integer без необходимости создания экземпляра календаря:

 return (System.currentTimeMillis()/1000/3600/24/365.25 +1970); 

Может быть, на час или два на новый год, но у меня не сложилось впечатление, что это проблема?

Я использую специальные функции в своей библиотеке для работы с днями / месяцами / годами ints –

 int[] int_dmy( long timestamp ) // remember month is [0..11] !!! { Calendar cal = new GregorianCalendar(); cal.setTimeInMillis( timestamp ); return new int[] { cal.get( Calendar.DATE ), cal.get( Calendar.MONTH ), cal.get( Calendar.YEAR ) }; }; int[] int_dmy( Date d ) { ... } 
Давайте будем гением компьютера.