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.


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


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

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


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

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

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

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

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.



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

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

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

    }

}

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.


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?


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 ) { 
 ...
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.