Domanda

Diciamo che ho una stringa che rappresenta una data che assomiglia a questo:

"mer 8 lug 17:08:48 GMT 2009"

Così ho parse che stringa in un oggetto data come questo:

DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss ZZZ yyyy");
Date fromDate = (Date)formatter.parse(fromDateString);

Questo mi dà l'oggetto data corretta. Ora voglio visualizzare questa data come un valore CDT.

Ho provato molte cose, e non riesco proprio a farlo funzionare correttamente. Ci deve essere un metodo semplice utilizzando la classe DateFormat per arrivare a questo lavoro. Qualche consiglio? Il mio ultimo tentativo è stato questo:

formatter.setTimeZone(toTimeZone);
String result = formatter.format(fromDate);
È stato utile?

Soluzione

Con "zzz" invece di "ZZZ":. "Z" è il simbolo di un tempo RFC822 zona

DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");

Detto questo, il mio consiglio di serie su roba data / ora è quella di utilizzare Joda Tempo , che è un'API complessivamente migliore.

EDIT: programma breve ma 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));
    }
}

Output: ven 8 lug 12:08:48 CDT 2009

Altri suggerimenti

Utilizzo:

formatter.setTimeZone(TimeZone.getTimeZone("US/Central"));

uscite:

Wed Jul 08 12:08:48 CDT 2009

per la data nel tuo esempio sulla mia macchina. Cioè dopo aver sostituito zzz per ZZZ nella stringa di formato.

Ci scusiamo per scavare un vecchio-thread. Ma mi chiedevo se v'è un java-classe che contiene tutti i time-zone-id come classe costante. Così, invece di dover codificare il time-zone-id durante l'impostazione del fuso orario in questo modo:

formatter.setTimeZone(TimeZone.getTimeZone("US/Central"));

ci sarebbe invece fare qualcosa di più standard / uniforme:

formatter.setTimeZone(TimeZone.getTimeZone(SomeConstantClass.US_CENTRAL)); 

dove SomeConstantClass.java è una classe che contiene le costanti relativi alle varie fuso orario-ID supportate dalla classe TimeZone.

Il modo moderno è con le classi java.time.

ZonedDateTime

Specifica uno schema di formattazione per abbinare il vostro stringa di input. I codici sono simili a SimpleDateFormat ma non esattamente. Assicurarsi di leggere il doc classe per DateTimeFormatter . Si noti che specifichiamo un Locale per determinare ciò che il linguaggio umano da utilizzare per il nome del giorno della settimana e il nome del mese.

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]

Possiamo registrare che in qualsiasi altro fuso orario.

corretta oraria Nome nel formato continent/region. Non usare mai il 3-4 lettera sigla come CDT o EST o IST in quanto non sono fusi orari veri e propri, non standardizzati, e nemmeno unici (!).

Mi immagino che CDT si intende un fuso orario come 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

In generale meglio lavorare in UTC. Per questo estrarre un Instant. Il Instant classe rappresenta un momento sulla timeline in UTC con una risoluzione di nanosecondi (fino a nove (9) cifre di una frazione decimale).

Questa classe Instant è una classe building-block di base del java.time. Si può pensare a ZonedDateTime come Instant più un ZoneId.

Instant instant = zdtChicago.toInstant();
  

instant.toString (): 2009-07-08T17: 08: 48Z


A proposito di java.time

Il java.time quadro è integrato in Java 8 e versioni successive. Queste classi soppiantare la fastidiosi come java.util.Date , .Calendar , e java.text.SimpleDateFormat .

Il Joda Time progetto, ora in modalità manutenzione , consiglia migrazione java.time.

Per ulteriori informazioni, vedere la Oracle Tutorial . E cercare Stack Overflow per molti esempi e spiegazioni. Le specifiche sono JSR 310 .

Dove ottenere le classi java.time?

Il ThreeTen-Extra progetto java.time estende con classi aggiuntive. Questo progetto è un banco di prova per eventuali aggiunte future java.time. Si possono trovare alcune classi utili, come per esempio Interval , YearWeek , YearQuarter , e informazioni .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top