Obtém o valor inteiro do ano atual em Java

Eu preciso determinar o ano atual em Java como um inteiro. Eu poderia apenas usar java.util.Date() , mas ele está obsoleto.

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

Não tem certeza se isso atende aos critérios de não configurar um novo Calendário? (Por que a oposição a fazê-lo?)

Usando a API de tempo do Java 8 (supondo que você esteja feliz em obter o ano no fuso horário padrão do seu sistema), você pode usar o método Year::now :

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

Este mais simples (usando o Calendário, desculpe) é:

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

Há também o novo JSR da API Date and Time , assim como o Joda Time

A maneira mais fácil é pegar o ano no Google Agenda.

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

Se você quiser o ano de qualquer object de data, usei o seguinte método:

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

tl; dr

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

Fuso horário

A resposta de Raffi Khatchadourian mostra sabiamente como usar o novo pacote java.time no Java 8. Mas essa resposta não resolve a questão crítica do fuso horário na determinação de uma data.

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

Esse código depende do fuso horário padrão atual da JVM. A zona padrão é usada para determinar qual é a data de hoje. Lembre-se, por exemplo, que no momento depois da meia-noite em Paris, a data em Montréal ainda é ‘ontem’.

Portanto, seus resultados podem variar de acordo com a máquina na qual ele é executado, um usuário / administrador alterando o fuso horário do sistema operacional host ou qualquer código Java a qualquer momento, alterando o padrão atual da JVM. Melhor especificar o fuso horário.

By the way, sempre use nomes de fuso horário adequados, conforme definido pela IANA . Nunca use os códigos de 3 a 4 letras que não são nem padronizados nem exclusivos.

java.time

Exemplo em java.time do Java 8.

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

Joda-Time

Alguma idéia como acima, mas usando a biblioteca Joda-Time 2.7.

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

Ano Incrementing / Decrementing

Se o seu objective é pular um ano de cada vez, não é necessário extrair o número do ano. Tanto o Joda-Time quanto o java.time possuem methods para adicionar / subtrair um ano de cada vez. E esses methods são inteligentes, lidando com o horário de verão e outras anomalias.

Exemplo no Joda-Time 2.7.

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

Se o seu aplicativo estiver fazendo uso pesado de objects Date e Calendar, você realmente deve usar o Joda Time, porque java.util.Date é mutável. java.util.Calendar tem problemas de desempenho quando seus campos são atualizados e é desajeitado para aritmética de data e hora.

Como algumas pessoas responderam acima:

Se você quiser usar a variável mais tarde, use melhor:

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

Se você precisa do ano apenas para uma condição, é melhor usar:

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

Por exemplo, usá-lo em um fazer, enquanto que as verificações introduzidas ano não é menor do que o ano atual-200 ou mais do que o ano atual (pode ser ano de nascimento):

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

Você também pode usar o LocalDate do Java 8:

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

Você também pode usar 2 methods de java.time.YearMonth (desde o Java 8):

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

Você pode fazer a coisa toda usando matemática Integer sem precisar instanciar um calendar:

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

Pode ser desligado por uma ou duas horas no ano novo, mas não tenho a impressão de que é um problema?

Eu uso funções especiais na minha biblioteca para trabalhar com dias / mês / ano –

 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 ) { ... }