Получить целое значение текущего года в Java - PullRequest
260 голосов
/ 26 сентября 2008

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

Ответы [ 12 ]

562 голосов
/ 26 сентября 2008
int year = Calendar.getInstance().get(Calendar.YEAR);

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

109 голосов
/ 13 ноября 2015

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

int year = Year.now().getValue();
25 голосов
/ 26 сентября 2008

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

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

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

13 голосов
/ 26 сентября 2008

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

// year is stored as a static member
int year = Calendar.getInstance().get(Calendar.YEAR);
10 голосов
/ 20 июля 2011

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

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;
}
9 голосов

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

import java.time.YearMonth;
...
int year = YearMonth.now().getYear();
int month = YearMonth.now().getMonthValue();
8 голосов
/ 04 мая 2015

ТЛ; др

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-Time

Некоторая идея, как указано выше, но с использованием библиотеки 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 ) ;
4 голосов
/ 26 сентября 2008

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

3 голосов
/ 06 марта 2015

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

import java.time.LocalDate;
//...
int year = LocalDate.now().getYear();
3 голосов
/ 24 ноября 2014

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

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

int year;

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

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

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

Например, использовать его в проверенном году, когда введенный чек будет не меньше текущего года - 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));
}
...