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);
Foi útil?

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?

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 .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top