Qual é a melhor maneira de converter um String
no formato '2 de janeiro de 2010' em um Date
em Java?
Por fim, quero dividir o mês, o dia e o ano como números inteiros para que eu possa usar
Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();
para converter a data em hora.
Date
estão obsoletos.java.util.Date
,java.util.Calendar
ejava.text.SimpleTextFormat
estão agora legado , suplantado pelos java.time classes. Consulte o Tutorial da Oracle .Respostas:
Essa é a maneira mais difícil, e esses
java.util.Date
métodos setter estão obsoletos desde o Java 1.1 (1997). Simplesmente formate a data usandoSimpleDateFormat
um padrão de formato correspondente à sequência de entrada .No seu caso específico de "2 de janeiro de 2010" como a sequência de entrada:
MMMM
padrão para eled
padrão para ele.yyyy
padrão para ele.Observe a importância do
Locale
argumento explícito . Se você o omitir, ele usará o código do idioma padrão, que não é necessariamente inglês, como é usado no nome do mês da sequência de entrada. Se o código do idioma não corresponder à sequência de entrada, você poderá obter um resultado confusojava.text.ParseException
quando o padrão de formato parecer válido.Aqui está um extrato de relevância do javadoc , listando todos os padrões de formato disponíveis:
Observe que os padrões diferenciam maiúsculas de minúsculas e que os padrões baseados em texto de quatro caracteres ou mais representam a forma completa; caso contrário, um formulário curto ou abreviado é usado, se disponível. Então, por exemplo,
MMMMM
ou mais, é desnecessário.Aqui estão alguns exemplos de
SimpleDateFormat
padrões válidos para analisar uma determinada string até o momento:Uma observação importante é que não
SimpleDateFormat
é seguro para threads. Em outras palavras, você nunca deve declarar e atribuí-lo como uma variável estática ou de instância e, em seguida, reutilizá-lo de diferentes métodos / threads. Você sempre deve criá-lo totalmente novo no escopo local do método.Atualização do Java 8
Se você estiver no Java 8 ou mais recente, use
DateTimeFormatter
(também aqui, clique no link para ver todos os formatadores predefinidos e padrões de formatos disponíveis; o tutorial está disponível aqui ). Essa nova API é inspirada no JodaTime .Nota: se o seu padrão de formato também contiver a parte da hora, use em
LocalDateTime#parse(text, formatter)
vez deLocalDate#parse(text, formatter)
. E, se o seu padrão de formato também contiver o fuso horário, use-oZonedDateTime#parse(text, formatter)
.Aqui está um extrato de relevância do javadoc , listando todos os padrões de formato disponíveis:
Observe que ele possui vários formatadores predefinidos para os padrões mais populares. Então, em vez de
DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
, por exemplo , você poderia usarDateTimeFormatter.RFC_1123_DATE_TIME
. Isso é possível porque eles são, ao contrárioSimpleDateFormat
, seguros para threads. Assim, você também pode definir o seu, se necessário.Para um formato de sequência de entrada específico, não é necessário usar um explícito
DateTimeFormatter
: uma data ISO 8601 padrão , como 2016-09-26T17: 44: 57Z, pode ser analisada diretamenteLocalDateTime#parse(text)
, pois já usa oISO_LOCAL_DATE_TIME
formatador. Da mesma forma,LocalDate#parse(text)
analisa uma data ISO sem o componente de hora (consulte aISO_LOCAL_DATE
) eZonedDateTime#parse(text)
analisa uma data ISO com um deslocamento e o fuso horário adicionados (consulteISO_ZONED_DATE_TIME
).fonte
O
, como deixá-lo imprimir emUTC+08:00
vez deGMT+08:00
. Não consegui nenhum exemplo.20-JUN-16 12.00.00.000000000 AM
, preciso de ajuda para converter isso em Data. Sua ajuda é muito apreciada!!Ah, sim a discussão sobre o Java Date, novamente. Para lidar com a manipulação de datas, usamos Date , Calendar , GregorianCalendar e SimpleDateFormat . Por exemplo, usando sua data de janeiro como entrada:
Então você pode manipular isso com algo como:
fonte
fonte
Com o Java 8, obtemos uma nova API de Data / Hora ( JSR 310 ).
A maneira a seguir pode ser usada para analisar a data no Java 8 sem depender do Joda-Time :
LocalDate é a classe Java 8 padrão para representar uma data (sem hora). Se você deseja analisar valores que contêm informações de data e hora, use LocalDateTime . Para valores com fusos horários, use ZonedDateTime . Ambos fornecem um
parse()
método semelhante aLocalDate
:Os caracteres de formatação da lista do Javadoc DateTimeFormatter :
fonte
Embora algumas das respostas sejam tecnicamente corretas, elas não são aconselháveis.
Esta popular biblioteca gratuita de código aberto pode ser usada em várias versões do Java. Muitos exemplos de seu uso podem ser encontrados no StackOverflow. A leitura de alguns deles ajudará você a se familiarizar rapidamente.
Este novo conjunto de classes é inspirado no Joda-Time e definido pelo JSR 310. Essas classes estão integradas no Java 8. Está em andamento um projeto para suportar essas classes no Java 7, mas esse backport não é suportado por Oráculo.
Data do dia tem uma parte da data e uma parte da hora do dia)
O início de um dia depende do fuso horário. Se você não especificar um fuso horário, o fuso horário padrão da JVM será aplicado. Isso significa que o comportamento do seu código pode mudar quando executado em outros computadores ou com uma configuração de fuso horário modificada. Provavelmente não é o que você quer.
O idioma da localidade especifica como interpretar as palavras (nome do mês e do dia) encontradas durante a análise. (A resposta de BalusC lida com isso adequadamente.) Além disso, o código de idioma afeta a saída de alguns formatadores ao gerar uma representação de seqüência de caracteres de sua data e hora.
Joda-Time
Seguem algumas notas sobre o Joda-Time.
Fuso horário
No Joda-Time , um objeto DateTime realmente conhece seu próprio fuso horário atribuído. Isso contrasta a classe java.util.Date, que parece ter um fuso horário, mas não.
Observe no código de exemplo abaixo como passamos um objeto de fuso horário para o formatador que analisa a string. Esse fuso horário é usado para interpretar a data e hora como ocorridas nesse fuso horário. Então, você precisa pensar e determinar o fuso horário representado por essa entrada de sequência.
Como você não possui uma parte da hora na sequência de entrada, o Joda-Time atribui o primeiro momento do dia do fuso horário especificado como a hora do dia. Geralmente isso significa,
00:00:00
mas nem sempre, por causa do horário de verão (DST) ou outras anomalias. A propósito, você pode fazer o mesmo com qualquer instância DateTime chamandowithTimeAtStartOfDay
.Padrão do formatador
Os caracteres usados no padrão de um formatador são semelhantes no Joda-Time aos caracteres no java.util.Date/Calendar, mas não exatamente iguais. Leia atentamente o documento.
Imutabilidade
Geralmente usamos as classes imutáveis no Joda-Time. Em vez de modificar um objeto Date-Time existente, chamamos métodos que criam uma nova instância nova com base no outro objeto com a maioria dos aspectos copiados, exceto onde as alterações foram desejadas. Um exemplo é a chamada para
withZone
na última linha abaixo. A imutabilidade ajuda a tornar o Joda-Time muito seguro para threads e também pode tornar o trabalho mais claro.Conversão
Você precisará de objetos java.util.Date para uso com outras classes / estruturas que não conhecem os objetos Joda-Time. Felizmente, é muito fácil ir e voltar.
Indo de um objeto java.util.Date (aqui chamado
date
) para Joda-Time DateTime…Indo na outra direção de Joda-Time para um objeto java.util.Date…
Código de amostra
Quando correr ...
fonte
Ao lidar com a classe SimpleDateFormat, é importante lembrar que o Date não é seguro para threads e você não pode compartilhar um único objeto Date com vários threads.
Também há uma grande diferença entre "m" e "M", onde letras minúsculas são usadas por minutos e letras maiúsculas são usadas por mês. O mesmo com "d" e "D". Isso pode causar erros sutis que geralmente são esquecidos. Consulte Javadoc ou Guide to Convert String to Date em Java para obter mais detalhes.
fonte
Isso funciona bem para mim.
fonte
Você pode usar o SimpleDateformat para alterar a string até a data
fonte
Além disso, SimpleDateFormat não está disponível com algumas das tecnologias do lado do cliente, como GWT .
É uma boa ideia ir para Calendar.getInstance (), e sua exigência é comparar duas datas; vá para um encontro longo.
fonte
Dois formatadores simples que usamos:
Analisamos o formato completo de data e hora:
fonte
Meu humilde programa de teste. Eu o uso para brincar com o formatador e procurar longas datas que encontro nos arquivos de log (mas quem os colocou lá ...).
Meu programa de teste:
Resultado dos testes:
fonte
Link de origem
Para Android
Calendar.getInstance (). GetTime () fornece
Usar
fonte
Conversão de String para Data:
fonte
Tente isto
fonte