Obter valor inteiro do ano atual em Java

300

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

karlgrz
fonte
3
Não, nãojava.util.Date está obsoleto, nem no Java 8. Alguns de seus métodos estão obsoletos, mas não a classe inteira. Mas você deve evitar os dois e como eles são notoriamente problemáticos, confusos e falhos. Em vez disso, use java.time (no Java 8) ou Joda-Time . java.util.Datejava.util.Calendar
Basil Bourque

Respostas:

636
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?)

cagcowboy
fonte
1
Ao ver sua resposta, o Google Agenda seria um ótimo objeto para usar. Eu estava procurando uma fila e não achei que o Calendar tivesse isso para mim. Eu estou provado errado! Obrigado!
karlgrz 25/09/08
E quanto à simultaneidade, e se outro encadeamento / parte do código da biblioteca mudar a hora atual? Não seria razoável modificá-lo para algo como: Calendar c = Calendar.getInstance (); sincronizado (c) {c.setTimeInMillis (System.currentTimeMillis ()); retorno c.get (Calendar.YEAR);}
jnr
1
Isso retorna um valor diferente em diferentes versões do Android. Estou comparando o Android v4.1.2 com o v4.2.1.
precisa saber é o seguinte
2
@ycnix Não há problema de simultaneidade com o código, portanto não há necessidade de torná-lo mais compilado. Calendar.getInstance().get(Calendar.YEAR) é atômico em relação ao relógio ser alterado externamente, e fazer synchronized(c)uma nova instância de uma variável local seria, de qualquer maneira, inútil aqui.
Nos
5
import java.util.Calendar
Dominykas Mostauskis
139

Usando a API de horário do Java 8 (assumindo que você tenha o prazer de receber o ano no fuso horário padrão do sistema), você pode usar o Year::nowmétodo :

int year = Year.now().getValue();
assylias
fonte
7
Sugiro sempre passar o ZoneIdargumento opcional para, em nowvez de confiar implicitamente na zona padrão atual da JVM (que pode mudar a qualquer momento durante o tempo de execução!).
Basil Bourque 23/05
Que parece com este BTW: int year = Year.now(ZoneId.of("America/New_York")).getValue(); docs.oracle.com/javase/8/docs/api/java/time/Year.html#now--
bcmoney
25

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

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

Há também o novo JSR da API de data e hora , bem como a hora de Joda

kit de ferramentas
fonte
Isso retorna um valor diferente em diferentes versões do Android. Estou comparando o Android v4.1.2 com o v4.2.1.
precisa saber é o seguinte
1
@ toobsco42 - tente pesquisar no Google 'bug do calendário do Android'
toolkit
Hey @toolkit, tenho pesquisado sem sorte. Eu estava esperando uma resposta mais específica.
precisa saber é o seguinte
Eu removi meu cartão SIM do telefone com 4.1.2. Portanto, a rede não conseguiu atualizar a Data e Hora no telefone. Consequentemente, o telefone ficou travado em 2012. Parece que isso não é um bug no 4.1.2.
precisa saber é o seguinte
14

A maneira mais fácil é obter o ano a partir do Calendário.

// year is stored as a static member
int year = Calendar.getInstance().get(Calendar.YEAR);
Conmulligan
fonte
Calendar.YEAR não é o ano atual.
toolkit
Calendar.YEAR é definido assim ... public final static int YEAR = 1;
Cagcowboy 25/09/08
2
A API get () no calendário obtém o dado que está no campo especificado pela constante. O ano está localizado no campo 1 no objeto Calendário! Calendar.getInstance () está recebendo a data atual. java.sun.com/j2se/1.4.2/docs/api/java/util/…
Bob King
Isso retorna um valor diferente em diferentes versões do Android. Estou comparando o Android v4.1.2 com o v4.2.1.
precisa saber é o seguinte
Eu removi meu cartão SIM do telefone com 4.1.2. Portanto, a rede não conseguiu atualizar a Data e Hora no telefone. Consequentemente, o telefone ficou travado em 2012. Parece que isso não é um bug no 4.1.2.
precisa saber é o seguinte
12

Você também pode usar 2 métodos em java.time.YearMonth(Desde o Java 8):

import java.time.YearMonth;
...
int year = YearMonth.now().getYear();
int month = YearMonth.now().getMonthValue();
Zhurov Konstantin
fonte
Você duplicou incorretamente outra resposta postada há muito tempo. E você produz um mês que é irrelevante para a pergunta. E você ignora a questão crucial do fuso horário. E sua formatação é confusa. Fico feliz em vê-lo participando do Stack Overflow. Mas esta resposta não é boa o suficiente. Edite para corrigir seus pontos fracos e agregar mais valor além do que já foi fornecido pelas outras Respostas. Ou exclua sua resposta antes que ela receba votos negativos. PS Super avatar ícone!
Basil Bourque
Valeu mesmo, cara. Eu editei. link é um pouco diferente que o meu caminho
Zhurov Konstantin
10

Se você deseja o ano de qualquer objeto 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;
}
basZero
fonte
resultado é 1970!
Dr. aNdRO
10

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 falha ao abordar a questão crítica do fuso horário na determinação de uma data.

int ano = 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 após a meia-noite em Paris a data em Montreal ainda é 'ontem'.

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

A propósito, sempre use nomes de fuso horário adequados, conforme definido pela IANA . Nunca use os códigos de 3-4 letras que não são 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 Incrementador / Decrementador

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

Exemplo em java.time .

ZonedDateTime zdt = 
    ZonedDateTime
    .now(  ZoneId.of( "Africa/Casablanca" )  )
    .minusYears( 1 ) 
;

Exemplo em Joda-Time 2.7.

DateTime oneYearAgo = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).minusYears( 1 ) ;
Basil Bourque
fonte
2
Todas as IDs de zona para os preguiçosos (como eu): mkyong.com/java8/java-display-all-zoneid-and-its-utc-offset
FBB
1
@FBB Sugiro a página da Wikipedia para a lista oficial da IANA de nomes de fuso horário. Cuidado: essas zonas mudam surpreendentemente com frequência. Se você realmente quer informações up-to-date, baixar uma nova cópia do o tzdataarquivo de dados a si mesmo. Você pode ler o arquivo. E você pode substituir um tzdata desatualizado em sua implementação Java. O Oracle fornece uma ferramenta de atualização para sua JVM.
Basil Bourque
4

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

Alan
fonte
3

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

import java.time.LocalDate;
//...
int year = LocalDate.now().getYear();
Raffi Khatchadourian
fonte
1
@ AndrewT., Obtenha o ThreeTen Backport e ele também funcionará em Java 6 e 7.
Ole VV
3

Como algumas pessoas responderam acima:

Se você deseja usar a variável posteriormente, use melhor:

int year;

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

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

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

Por exemplo, usá-lo durante um período em que as verificações introduzidas não são menores que o ano atual-200 ou mais que o ano atual (pode ser o 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));
}
maral04
fonte
3

Use o seguinte código para java 8:

LocalDate localDate = LocalDate.now();
int year = localDate.getYear();
int month = localDate.getMonthValue();
int date = localDate.getDayOfMonth();
KayV
fonte
0

No meu caso, nenhuma das opções acima é trabalhada. Então, depois de tentar muitas soluções, encontrei abaixo uma e funcionou para mim

import java.util.Scanner;
import java.util.Date;

public class Practice
{   
    public static void main(String[] args)
    {
        Date d=new Date();  
        int year=d.getYear();
        int currentYear=year+1900;    

        System.out.println(currentYear);

    }

}
Mayur Satav
fonte
Esse método está obsoleto. E essa classe terrível foi substituída anos atrás pelas classes java.time definidas no JSR 310. Veja a solução moderna na resposta por assylias .
Basil Bourque
sim, mas eu estava procurando ativamente por uma solução e tentei muitas soluções disponíveis e, para mim, essa funcionou, então eu postei :)
Mayur Satav
-1

Na versão 8+ do Java, é possível (recomendado) usar a biblioteca java.time . A ISO 8601 define a maneira padrão de escrever datas: YYYY-MM-DDe java.time.Instantusa-a, então (para UTC):

import java.time.Instant;
int myYear = Integer.parseInt(Instant.now().toString().substring(0,4));

PS apenas por precaução (e com Stringfalta de obtê-lo int), usar o Calendarvisual parece melhor e pode ser feito com reconhecimento de zona.

Alexei Martianov
fonte
Você está ignorando a questão crucial do fuso horário. Veja a solução mais simples em outra resposta .
Basil Bourque
-2

Você pode fazer a coisa toda usando matemática inteira sem precisar instanciar um calendário:

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

Pode demorar uma ou duas horas no ano novo, mas não tenho a impressão de que seja um problema?

Ewan Makepeace
fonte
9
você está trabalhando para a maçã, talvez? Macworld.com/article/2023580/…
Stefan Paul Noack
uau, isso é muito pesado, sugiro que seja simples como o cagcowboy mostrou.
precisa saber é o seguinte
Isso pode não ser o melhor em todas as circunstâncias, mas não merece votos negativos.
JohnnyLambada
-4

Uso funções especiais na minha biblioteca para trabalhar com dias / mês / ano 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 ) { 
 ...
}
maxp
fonte