Pergunta

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

Foi útil?

Solução

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

Não se esta cumpre com os critérios de não estabelecer um novo calendário? (Por que a oposição a fazê-lo?)

Outras dicas

Usando API tempo de Java 8 (supondo que você está feliz para começar o ano no fuso horário padrão do sistema), você pode usar o método Year::now :

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

Esta simples (usando Calendário, sorry) é:

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

Há também o novo Data e Hora API JSR , bem como Joda Tempo

A maneira mais fácil é fazer com que o ano de calendário.

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

Se você deseja que o ano de qualquer objeto data, eu 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;
}

Você também pode usar 2 métodos de java.time.YearMonth (Desde 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()

Fuso Horário

A resposta por Raffi Khatchadourian mostra sabiamente como usar o novo java.time pacote em Java 8. Mas essa resposta não consegue resolver a questão crítica da zona de tempo para determinar uma data.

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

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

Assim, os resultados podem variar de acordo com o que a máquina é executado em, um usuário / admin mudar o fuso horário sistema operacional hospedeiro, ou qualquer código Java a qualquer momento mudando padrão atual da JVM. Melhor especificar o fuso horário.

A propósito, sempre use momento adequado nomes de zona como definido pela IANA . Nunca use os códigos de 3-4 letras que não são nem padronizados nem únicos.

java.time

Exemplo em java.time de Java 8.

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

Joda-Time

Alguns ideia como acima, mas usando a Joda-Time 2.7 biblioteca.

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

Incremento / Decrementando Ano

Se o seu objetivo é saltar um ano de cada vez, sem necessidade de extrair o número do ano. Ambos Joda-Time e java.time tem métodos para adicionar / subtrair um ano de cada vez. E esses métodos são inteligentes, manuseio de horário de verão e outras anomalias.

Exemplo em Jodá-Tempo 2.7.

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

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

Você também pode usar Java 8 de LocalDate :

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

Como algumas pessoas respondida acima:

Se você quiser usar a variável mais tarde, a melhor utilização:

int year;

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

Se você precisar do ano para apenas uma condição que você uso melhor:

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

Por exemplo, utilizando-o em um fazer enquanto que ano verificações introduzido não é menor do que o atual ano-200 ou mais do que o ano em curso (Poderia ser ano do 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ê pode fazer a coisa toda usando Integer matemática sem a necessidade de instanciar um calendário:

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

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

Eu uso funções especiais na minha biblioteca para trabalhar com dias / mês ints / 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 ) { 
 ...
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top