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?)
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 :
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!).
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 memberint year =Calendar.getInstance().get(Calendar.YEAR);
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:
publicstaticint getYearFromDate(Date date){int result =-1;if(date !=null){Calendar cal =Calendar.getInstance();
cal.setTime(date);
result = cal.get(Calendar.YEAR);}return result;}
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.
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.
@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.
@ 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;publicstaticvoid main (String[] args){Scanner scannernumber =newScanner(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));}
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):
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
Respostas:
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?)
fonte
Calendar.getInstance().get(Calendar.YEAR)
é atômico em relação ao relógio ser alterado externamente, e fazersynchronized(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 :fonte
ZoneId
argumento opcional para, emnow
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) é:
Há também o novo JSR da API de data e hora , bem como a hora de Joda
fonte
A maneira mais fácil é obter o ano a partir do Calendário.
fonte
Você também pode usar 2 métodos em
java.time.YearMonth
(Desde o Java 8):fonte
Se você deseja o ano de qualquer objeto de data, usei o seguinte método:
fonte
tl; dr
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.
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.
Joda-Time
Alguma idéia como acima, mas usando a biblioteca Joda-Time 2.7.
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 .
Exemplo em Joda-Time 2.7.
fonte
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.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.Calendar
tem problemas de desempenho quando seus campos são atualizados e é desajeitado para aritmética de data e hora.fonte
Você também pode usar o Java 8
LocalDate
:fonte
Como algumas pessoas responderam acima:
Se você deseja usar a variável posteriormente, use melhor:
Se você precisar do ano apenas para uma condição, é melhor usar:
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):
fonte
Use o seguinte código para java 8:
fonte
No meu caso, nenhuma das opções acima é trabalhada. Então, depois de tentar muitas soluções, encontrei abaixo uma e funcionou para mim
fonte
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
ejava.time.Instant
usa-a, então (paraUTC
):PS apenas por precaução (e com
String
falta de obtê-loint
), usar oCalendar
visual parece melhor e pode ser feito com reconhecimento de zona.fonte
Você pode fazer a coisa toda usando matemática inteira sem precisar instanciar um calendário:
Pode demorar uma ou duas horas no ano novo, mas não tenho a impressão de que seja um problema?
fonte
Uso funções especiais na minha biblioteca para trabalhar com dias / mês / ano ints -
fonte