Respostas:
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?)
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.
import java.util.Calendar
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::now
método :
int year = Year.now().getValue();
ZoneId
argumento opcional para, em now
vez de confiar implicitamente na zona padrão atual da JVM (que pode mudar a qualquer momento durante o tempo de execução!).
int year = Year.now(ZoneId.of("America/New_York")).getValue();
docs.oracle.com/javase/8/docs/api/java/time/Year.html#now--
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
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);
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();
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;
}
ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) )
.getYear()
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.
Exemplo em java.time do Java 8.
int year = ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) ).getYear() ;
Alguma idéia como acima, mas usando a biblioteca Joda-Time 2.7.
int year = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).getYear() ;
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 ) ;
tzdata
arquivo 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.
Você também pode usar o Java 8 LocalDate
:
import java.time.LocalDate;
//...
int year = LocalDate.now().getYear();
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));
}
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);
}
}
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-DD
e java.time.Instant
usa-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 String
falta de obtê-lo int
), usar o Calendar
visual parece melhor e pode ser feito com reconhecimento de zona.
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?
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 ) {
...
}
java.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.Date
java.util.Calendar