Como faço para exibir uma data com um fuso horário personalizado?
-
19-09-2019 - |
Pergunta
Vamos dizer que eu tenho um string que representa uma data que se parece com isso:
"Wed 08 de julho 17:08:48 GMT 2009"
Então, eu analisar essa string em um objeto data como esta:
DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss ZZZ yyyy");
Date fromDate = (Date)formatter.parse(fromDateString);
Isso me dá o objeto data correta. Agora eu quero mostrar esta data como um valor CDT.
Eu tentei muitas coisas, e eu simplesmente não posso fazê-lo funcionar corretamente. Deve haver um método simples usando a classe DateFormat para chegar a este trabalho. Algum conselho? Minha última tentativa foi a seguinte:
formatter.setTimeZone(toTimeZone);
String result = formatter.format(fromDate);
Solução
Use "zzz" em vez de "ZZZ":. "Z" é o símbolo para um fuso horário RFC822
DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
Dito isto, o meu conselho padrão em data / stuff tempo é usar Joda Tempo , que é um melhor conjunto API.
EDIT: Short but programa completo:
import java.text.*;
import java.util.*;
public class Test
{
public List<String> names;
public static void main(String [] args)
throws Exception // Just for simplicity!
{
String fromDateString = "Wed Jul 08 17:08:48 GMT 2009";
DateFormat formatter = new SimpleDateFormat
("EEE MMM dd HH:mm:ss zzz yyyy");
Date fromDate = (Date)formatter.parse(fromDateString);
TimeZone central = TimeZone.getTimeZone("America/Chicago");
formatter.setTimeZone(central);
System.out.println(formatter.format(fromDate));
}
}
Saída: Qua 08 julho CDT 12:08:48 2009
Outras dicas
Usando:
formatter.setTimeZone(TimeZone.getTimeZone("US/Central"));
saídas:
Wed Jul 08 12:08:48 CDT 2009
para a data no seu exemplo na minha máquina. Isso é depois substituindo zzz para ZZZ na string de formato.
Infelizmente para cavar um velho-thread. Mas eu queria saber se existe uma classe java que contém todos os fuso horário-ids como uma classe constante. Então, ao invés de ter de codificar o tempo-zone-id ao definir fuso horário como este:
formatter.setTimeZone(TimeZone.getTimeZone("US/Central"));
nós, ao invés, estar fazendo algo mais / uniforme padrão:
formatter.setTimeZone(TimeZone.getTimeZone(SomeConstantClass.US_CENTRAL));
onde SomeConstantClass.java é uma classe que contém as constantes referentes aos diferentes fusos horários-ids que são suportados pela classe TimeZone.
A forma moderna é com as classes java.time.
ZonedDateTime
Especifique um padrão de formatação para corresponder à sua cadeia de entrada. Os códigos são semelhantes aos SimpleDateFormat
mas não exatamente. Não deixe de ler o doc classe para DateTimeFormatter
. Nota que especificar um Locale
para determinar o que a linguagem humana para usar o nome do dia da semana e o nome do mês.
String input = "Wed Jul 08 17:08:48 GMT 2009";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "EEE MMM dd HH:mm:ss z uuuu" , Locale.ENGLISH );
ZonedDateTime zdt = ZonedDateTime.parse ( input , f );
zdt.toString (): 2009-07-08T17: 08: 48Z [GMT]
Podemos ajustar isso em qualquer outro fuso horário.
Especifique um tempo apropriado nome de zona no formato de continent/region
. Nunca utilize o 3-4 letras, como CDT
ou EST
ou IST
como eles não são zonas de verdadeiros tempo, não padronizados, e nem mesmo única (!).
Eu acho que por CDT
você significou um fuso horário como America/Chicago
.
ZoneId z = ZoneId.of( "America/Chicago" );
ZonedDateTime zdtChicago = zdt.withZoneSameInstant( z );
zdtChicago.toString () 2009-07-08T12: 08: 48-05: 00 [America / Chicago]
Instant
Geralmente melhor para trabalhar em UTC. Para que extrair um Instant
. A Instant
classe representa um momento no cronograma em UTC com uma resolução de nanossegundos (até nove (9) dígitos de uma fração decimal).
Esta classe Instant
é uma classe de bloco de construção básico de java.time. Você pode pensar em ZonedDateTime
como um Instant
mais um ZoneId
.
Instant instant = zdtChicago.toInstant();
instant.toString (): 2009-07-08T17: 08: 48Z
Sobre java.time
O java.time quadro é construído em Java 8 e posterior. Essas classes suplantar o problemático idade legados aulas de data e hora, como java.util.Date
, .Calendar
, e java.text.SimpleDateFormat
.
O Joda-Time projeto, agora em modo de manutenção , aconselha migração para java.time.
Para saber mais, consulte a a Oracle Tutorial . E busca Stack Overflow para muitos exemplos e explicações. Especificação é JSR 310 .
Onde obter as classes java.time?
- Java SE 8 e SE 9 e mais tarde
- Built-in.
- Parte da API Java padrão com uma implementação empacotado.
- Java 9 adiciona alguns recursos menores e correções.
- Java SE 6 e SE 7
- Grande parte da funcionalidade java.time é back-portados para o Java 6 e 7 em ThreeTen-Backport .
- Android
- ThreeTenABP se adapta projeto ThreeTen- backport (mencionados acima) para Android especificamente.
- Como usar ... .
O projeto ThreeTen-Extra estende java.time com aulas adicionais. Este projeto é um campo de provas para possíveis adições futuras para java.time. Você pode encontrar algumas classes úteis aqui, como Interval
, YearWeek
, YearQuarter
, e mais .