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

StackOverflow https://stackoverflow.com/questions/136419

  •  02-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

tl;dr

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

Часовой пояс

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

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

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

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

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

java.время

Пример на Java.время разработки Java 8.

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

Джода-Время

Некоторая идея, как указано выше, но с использованием Джода-Время 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 ) ;

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

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

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

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

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

int year;

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

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

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

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

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

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

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

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

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 ) { 
 ...
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top