2010-11-17 22 views
9

Ho una stringa nel modello aaaa-MM-gg hh: mm a e posso ottenere l'oggetto del fuso orario separatamente in cui la stringa precedente rappresenta la data.Conversione di una stringa con fuso orario

Voglio convertirlo nel formato seguente. aaaa-MM-gg HH: mm: ss Z

Come posso fare questo?

+0

http://joda-time.sourceforge.net/ rende tutte le manipolazioni di date in java molto più facili – NimChimpsky

+0

@Emil ho avuto modo di conoscere questa funzione dopo aver detto :), grazie. – John

+1

FYI, il progetto [Joda-Time] (http://www.joda.org/joda-time/) è ora in [modalità manutenzione] (https://en.wikipedia.org/wiki/Maintenance_mode), con il team che consiglia la migrazione alle classi [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html). –

risposta

5

Usa SimpleDateFormat

String string1 = "2009-10-10 12:12:12 "; 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z") 
sdf.setTimeZone(tz); 
Date date = sdf.parse(string1); 
+0

alcune volte il getID() restituisce la stringa come questa "America/Argentina/Ushuaia". Quindi, come posso usarlo – John

+0

-1: questo genererà ParseException sulla maggior parte dei Fusi orari. –

+0

@Michael Konietzka @shal Ho fretta di non averlo visto, ho aggiornato la risposta –

0

creare una nuova istanza di SimpleDateFormat utilizzare il modello di data. Successivamente è possibile chiamare il metodo di analisi per convertire le stringhe di data in un oggetto java.util.Date.

16

È possibile utilizzare SimpleDateFormat con yyyy-MM-dd HH:mm:ss e impostare in modo esplicito i TimeZone:

public static Date getSomeDate(final String str, final TimeZone tz) 
    throws ParseException { 
    final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm a"); 
    sdf.setTimeZone(tz); 
    return sdf.parse(str); 
} 

/** 
* @param args 
* @throws IOException 
* @throws InterruptedException 
* @throws ParseException 
*/ 
public static void main(final String[] args) throws ParseException { 
    final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); 
    System.out.println(sdf.format(getSomeDate(
     "2010-11-17 01:12 pm", TimeZone.getTimeZone("Europe/Berlin")))); 
    System.out.println(sdf.format(getSomeDate(
     "2010-11-17 01:12 pm", TimeZone.getTimeZone("America/Chicago")))); 
} 

Stampa in:

2010-11-17 13:12:00 +0100

2010- 11-17 20:12:00 +0100

Aggiornamento 2010-12-01: Se si desidera per stampare in modo esplicito un fuso orario speciale, impostarlo nel SimpleDateFormat:

sdf.setTimeZone(TimeZone .getTimeZone("IST")); 
System.out.println(sdf.format(getSomeDate(
    "2010-11-17 01:12 pm", TimeZone.getTimeZone("IST")))); 

che stampa 2010-11-17 13:12:00 +0530

+0

Grazie Mr.Michael, La data e l'ora vengono cambiate in base al fuso orario.Nota il +100, non cambia l'offset TIMEZONE – John

+0

@shal : Scusa, non capisco la tua seconda frase. Pensi che qualcosa non vada? –

+0

@ Michael, sto dicendo che il tempo sta per essere convertito correttamente ma vedere la parte "Z" nei valori di data stampati "+0100" non cambia. Per esempio se sto convertendo una data da GMT a IST allora il " Z "parte della data di conversione deve essere" +0530 ". – John

0

Indubbiamente, il formato che viene generalmente utilizzato sarà essere di forma 2014-10-05T15:23:01Z (TZ)

per questo si deve utilizzare questo codice

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); 
String dateInString = "2014-10-05T15:23:01Z"; 

try { 

    Date date = formatter.parse(dateInString.replaceAll("Z$", "+0000")); 
    System.out.println(date); 

} catch (ParseException e) { 
    e.printStackTrace(); 
} 

La sua uscita sarà Sun Oct 05 20:53:01 IST 2014

Tuttavia, non sono sicuro del motivo per cui abbiamo dovuto sostituire All "Z" se non si aggiunge replaceAll il programma avrà esito negativo.

4

tl; dr

LocalDateTime.parse( // Parse string as value without time zone. 
    "2017-01-23 12:34 PM" , 
    DateTimeFormatter.ofPattern("uuuu-MM-dd hh:mm a") 
).atZone(ZoneId.of("America/Montreal")) // Assign time zone. 
.toString()    // Generate string: 2017-01-23T17:34:00Z 
.replace("T" , " ") // Substitute SPACE for 'T' in middle. 
.replace("Z" , " Z") // Insert SPACE before 'Z'. 

Evita legacy classi data-ora

Le altre risposte utilizzano le classi fastidiosi scendere Data-time (Date, Calendar, ecc), ora legacy, soppiantato dal classi java.time.

LocalDateTime

Ho una stringa nel modello hh aaaa-MM-dd: mm a

Tale stringa di input è priva di qualsiasi indicazione di offset da-UTC o fuso. Quindi analizziamo come LocalDateTime.

Definire un modello di formattazione che corrisponda all'input con un oggetto DateTimeFormatter.

String input = "2017-01-23 12:34 PM" ; 
DateTimeFormatter f = DateTimeFormatter.ofPattern("uuuu-MM-dd hh:mm a"); 
LocalDateTime ldt = LocalDateTime.parse(input , f); 

ldt.toString(): 2017-01-23T12: 34

Nota che un LocalDateTime è non uno specifico momento, solo una vaga idea di una serie di possibili momenti . Ad esempio, pochi minuti dopo la mezzanotte a Parigi, la Francia è ancora "ieri" a Montréal, in Canada. Quindi, senza il contesto di un fuso orario come Europe/Paris o America/Montreal, solo dire "pochi minuti dopo mezzanotte" non ha alcun significato.

ZoneId

e posso ottenere la zona oggetto tempo separatamente in cui la stringa sopra rappresenta la data.

Un fuso orario è rappresentato dalla classe ZoneId.

Specificare un proper time zone name nel formato continent/region, come ad esempio America/Montreal, Africa/Casablanca o Pacific/Auckland. Non utilizzare mai l'abbreviazione di 3-4 lettere come EST o IST poiché sono non fusi orari reali, non standardizzati e nemmeno univoci (!).

ZoneId z = ZoneId.of("America/Montreal"); 

ZonedDateTime

Applicare la ZoneId per ottenere un ZonedDateTime, che è davvero un punto sulla timeline, un determinato momento della storia.

ZonedDateTime zdt = ldt.atZone(z); 

zdt.toString(): 2017-01-23T12: 34-05: 00 [America/Montreal]

Instant

voglio convertire questo a il seguente formato aaaa-MM-dd HH: mm: ss Z

Innanzitutto, sappiamo che un carattere letterale Z è l'abbreviazione di Zulu e mezzi UTC. In altre parole, un offset-from-UTC di zero ore, +00:00.

La classe Instant rappresenta un momento sulla timeline in UTC con una risoluzione di nanoseconds (fino a nove (9) cifre di una frazione decimale).

È possibile estrarre un oggetto Instant da un ZonedDateTime.

Instant instant = zdt.toInstant(); // Extracting the same moment but in UTC. 

per generare una stringa in formato standard ISO 8601, come ad esempio 2017-01-22T18:21:13.354Z, chiamare toString. Il formato standard non ha spazi, utilizza uno T per separare l'anno-mese-data dall'ora-minuto-secondo e aggiunge il Z canonico per un offset pari a zero.

String output = instant.toString(); 

instant.toString(): 2017-01-23T17: 34: 00Z

vi consiglio vivamente di utilizzare i formati standard quando possibile. Se si insiste a utilizzare gli spazi come nel formato desiderato specificato, definire il proprio modello di formattazione in un oggetto DateTimeFormatter o eseguire semplicemente una manipolazione di stringa sull'output di Instant::toString.

String output = instant.toString() 
         .replace("T" , " ") // Substitute SPACE for T. 
         .replace("Z" , " Z"); // Insert SPACE before Z. 

uscita: 2017/01/23 17:34:00 Z

Prova questo code live at IdeOne.com.


Chi java.time

Il quadro java.time è costruito in Java 8 e versioni successive. Queste classi soppiantano le fastidiose classi data legacy come java.util.Date, Calendar, & SimpleDateFormat.

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

Per ulteriori informazioni, vedere Oracle Tutorial. E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310.

Dove ottenere le classi java.time?

  • Java SE 8 e SE 9 e successivamente
    • incorporato.
    • Parte dell'API Java standard con un'implementazione in bundle.
    • Java 9 aggiunge alcune funzionalità e correzioni minori.
  • Java SE 6 e SE 7
    • Molte delle funzionalità java.time è di back-porting per Java 6 .
  • Android

Il progetto ThreeTen-Extra java.time prolunga 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 more.

Problemi correlati