2012-05-23 10 views
9

Ok, quindi ho una stringa, diciamo "Mar 21 Mag 14:32:00 GMT 2012" Voglio convertire questa stringa in ora locale nel formato 21 maggio , 2012 2:32 pm. Ho provato SimpleDateFormat ("MM gg, aaaa hh: mm a"). Parse(), ma ha lanciato un'eccezione. Quindi cosa dovrei fare?Java/Android - Convertire una stringa di tempo GMT all'ora locale

L'eccezione è "eccezione non dichiarata java.text.ParseException; deve essere rilevata o dichiarata per essere generata".

nella linea Date date = inputFormat.parse(inputText);

Il codice mi sono imbattuto su TextMate:

public class test{ 
    public static void main(String arg[]) { 
     String inputText = "Tue May 22 14:52:00 GMT 2012"; 
     SimpleDateFormat inputFormat = new SimpleDateFormat(
      "EEE MMM dd HH:mm:ss 'GMT' yyyy", Locale.US); 
     inputFormat.setTimeZone(TimeZone.getTimeZone("Etc/UTC")); 
     SimpleDateFormat out = new SimpleDateFormat("MMM dd, yyyy h:mm a"); 
     Date date = inputFormat.parse(inputText); 
     String output = out.format(date); 
     System.out.println(output); 
    } 
} 
+0

Qual è l'eccezione? –

+0

qual è stata l'eccezione? – Jeshurun

+0

Il testo di esempio in alto è il 21, che è un lunedì e non un martedì. Diverso dal codice di esempio. –

risposta

20

La stringa di formato che hai fornito per l'analisi non corrisponde con il formato di testo che hai effettivamente ottenuto. È necessario analizzare prima, quindi formattare. Sembra che si desidera:

SimpleDateFormat inputFormat = new SimpleDateFormat(
    "EEE MMM dd HH:mm:ss 'GMT' yyyy", Locale.US); 
inputFormat.setTimeZone(TimeZone.getTimeZone("Etc/UTC")); 

SimpleDateFormat outputFormat = new SimpleDateFormat("MMM dd, yyyy h:mm a"); 
// Adjust locale and zone appropriately 

Date date = inputFormat.parse(inputText); 
String outputText = outputFormat.format(date); 

EDIT: Ecco lo stesso codice sotto forma di un programma breve ma completo, con il vostro input di esempio:

import java.util.*; 
import java.text.*; 

public class Test { 
    public static void main(String[] args) throws ParseException { 
     String inputText = "Tue May 21 14:32:00 GMT 2012"; 
     SimpleDateFormat inputFormat = new SimpleDateFormat 
      ("EEE MMM dd HH:mm:ss 'GMT' yyyy", Locale.US); 
     inputFormat.setTimeZone(TimeZone.getTimeZone("Etc/UTC")); 

     SimpleDateFormat outputFormat = 
      new SimpleDateFormat("MMM dd, yyyy h:mm a"); 
     // Adjust locale and zone appropriately 
     Date date = inputFormat.parse(inputText); 
     String outputText = outputFormat.format(date); 
     System.out.println(outputText); 
    } 
} 

Potete compilare ed eseguire che il codice esatto?

+1

L'ho provato, ma la riga Date date = inputFormat.parse (inputText); ancora gettare l'eccezione che ho citato sopra :( – Manto

+0

@ user1066956: Per favore inserisci la stringa * esatta * coinvolta allora - perché ho usato la stringa che mi hai dato nella domanda, ed è andata bene –

+0

"Tue May 21 14:32:00 GMT 2012 "è la stringa esatta che ho usato. Ho eseguito il seguente codice in TextMate e ho ricevuto l'errore che ho menzionato sopra. – Manto

3

Il formattatore che si utilizza per analizzare deve essere definito nel formato previsto. Ecco un esempio che funziona per i valori che hai fornito tuttavia, potrebbe essere necessario cambiare a seconda di come alcuni casi limite agiscono per l'ingresso:

String date = "Tue May 21 14:32:00 GMT 2012"; 
DateFormat inputFormat = new SimpleDateFormat("EE MMM dd HH:mm:ss zz yyy"); 
Date d = inputFormat.parse(date); 
DateFormat outputFormat = new SimpleDateFormat("MMM dd, yyy h:mm a zz"); 
System.out.println(outputFormat.format(d)); 
1

Il metodo SimpleDateFormat.parse genera un'eccezione di analisi.

L'eccezione che stai ricevendo vi sta dicendo questo ...

L'eccezione è "non dichiarata java.text.ParseException eccezione;. devono essere catturati o dichiarato di essere gettato"

Wrap la linea che fa il parsing con try-catch e si dovrebbe essere d'oro ..

Date d=null; 
try{ 
    d = inputFormat.parse(date); 
catch(ParseException e){ 
    // handle the error here.... 
} 

R

1

Si stanno utilizzando fastidiose classi data/ora ora soppiantate dalle classi java.time.

dati di input errati

tua prima corda ad esempio non è corretto, in quanto il 21 è un non Lunedi di Martedì. La seconda stringa di esempio con 22nd è corretta e utilizzata nel mio codice di esempio qui sotto.

Utilizzando java.time Evitare

utilizzando questo tipo di formato per le rappresentazioni testuali di valori di data e ora. In particolare, non utilizzare mai l'abbreviazione di 3-4 lettere come EST o IST visto in questo tipo di formato, in quanto non sono veri fusi orari, non standardizzati e nemmeno univoci (!). Specificare uno proper time zone name. In questo caso particolare, java.time è in grado di tradurre questo come GMT come UTC, ma altri valori potrebbero non riuscire.

String input = "Tue May 22 14:52:00 GMT 2012"; 
DateTimeFormatter f = DateTimeFormatter.ofPattern ("EEE MMM dd HH:mm:ss z uuuu").withLocale (Locale.US); 
ZonedDateTime zdt = ZonedDateTime.parse (input , f); 

System.out.println ("zdt: " + zdt); 

Discarica per consolle. Il metodo toString genera una stringa nel formato standard ISO 8601, estesa aggiungendo il nome della zona tra parentesi. Questi formati standard sono una scelta molto migliore quando è necessario serializzare i valori di data e ora in testo.

System.out.println ("zdt: " + zdt); 

zdt: 2012-05-22T14: 52Z [GMT]

Generare String

È possibile generare una stringa per rappresentare questo valore in qualsiasi formato che desiderate. Generalmente è meglio lasciare che java.time si localizzi automaticamente usando uno Locale e DateTimeFormatter.

Il formato desiderato utilizza uno stile di media lunghezza per la parte di data ma uno stile di breve durata per la porzione di ora del giorno. Fortunatamente il DateTimeFormatter consente di localizzare ciascuna porzione separatamente, come si vede qui dove passiamo una coppia di oggetti FormatStyle.

Locale l = Locale.US; // Or Locale.CANADA_FRENCH, or Locale.ITALY, etc. 
DateTimeFormatter fOutput = DateTimeFormatter.ofLocalizedDateTime (FormatStyle.MEDIUM , FormatStyle.SHORT).withLocale (l); 
String output = zdt.format (fOutput); 

Discarica per consolle.

System.out.println ("zdt: " + zdt + " | output: " + output); 

zdt: 2012-05-22T14: 52Z [GMT] | uscita: 22 maggio 2012 14:52

Chi java.time

Il quadro java.time è integrato in Java 8 e versioni successive. Queste classi sostituiscono le vecchie e fastidiose lezioni di data-ora come java.util.Date, .Calendar, & java.text.SimpleDateFormat.

Il progetto Joda-Time, ora in maintenance mode, consiglia la migrazione a java.time.

Per ulteriori informazioni, vedere Oracle Tutorial. E cerca Stack Overflow per molti esempi e spiegazioni.

Molte delle funzionalità java.time è back-porting di Java 6 & 7 in ThreeTen-Backport e in seguito atto a Android in ThreeTenABP (vedi How to use…).

Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un terreno di prova per possibili aggiunte future a java.time. È possibile trovare alcune classi utili come Interval, YearWeek, YearQuarter e altro.

Problemi correlati