Obter valor inteiro do ano atual em Java
Pergunta
Eu preciso para determinar o ano atual em Java como um inteiro. Eu poderia usar apenas java.util.Date()
, mas é obsoleto.
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 ) {
...
}