2015-08-20 25 views
5

La conversione di data e ora è sempre stata il mio anello debole. Ho i seguenti valori in formato stringa:Convertire la data con fuso orario noto alla data UTC

  1. data String = "2015/08/21 03:15" ed il fuso orario per questa data è
  2. fuso orario Stringa = "GMT + 05: 30";

Ora ho bisogno di coprire questa data, per cui conosco già il fuso orario, alla data UTC.

+0

È possibile utilizzare l'API di data/ora Java 8? –

+0

@MickMnemonic Sto usando Java8 solo –

risposta

1

Se si è dato tempo a Il fuso orario "GMT + 05: 30" successivo lo convertirà in fuso orario UTC:

String strDate = "2015-08-21 03:15"; 
String timeZone="GMT+05:30"; 
String format = "yyyy-MM-dd HH:mmz"; 
SimpleDateFormat formatter = new SimpleDateFormat(format); 
Date dateStr = formatter.parse(strDate+timeZone); 
formatter.setTimeZone(TimeZone.getTimeZone("UTC")); 
String formattedDate = formatter.format(dateStr); 
System.out.println("UTC datetime is: "+formattedDate); 
+0

il tuo codice fornisce un'uscita come 2015-08-20 22:15 Z Secondo questo sito web dovrebbe essere 21- Aug 9:45 pm http://www.worldtimeserver.com/convert_time_in_UTC.aspx?y=2015&mo=8&d= 20 & h = 21 & mn = 45 –

+0

@HiteshBhutani Ho aggiornato leggermente il codice.La risposta corretta è 20-ago 21:45 UTC. E sì, dovrebbe essere il 20 agosto, non il 21, perché l'UTC è "dietro" GMT + 5: 30 –

+0

Perfetto. E sì, la risposta corretta è il 20 agosto. Mi sono reso conto dopo che ho postato il commento che non era corretto, ma ho dimenticato di aggiornare. Grazie per il salvataggio. Segnerò le risposte come accettate. –

0

Si può vedere:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss"); 
Date date = null; 
try { 
    //Here you say to java the initial timezone. This is the secret 
    sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 
    date = sdf.parse(review); 
} catch (ParseException e) { 
    e.printStackTrace(); 
    } 

//Here you set to your timezone 
sdf.setTimeZone(TimeZone.getDefault()); 
System.out.println(sdf.format(date)); 
+0

Che cos'è 'review'? Per quanto posso vedere, si sta tentando di convertire una data UTC in una data locale (che non è ciò che l'OP chiedeva). – Hulk

1

si può provare in questo modo:

Approccio 1: Utilizzo di Java Data:

//Your input date string 
String date="2015-08-21 03:15"; 

// date format your string 
String format = "yyyy-MM-dd HH:mm"; 

//Create SimpleDateFormat instance 
SimpleDateFormat sdf = new SimpleDateFormat(format); 

// Convert Local Time to UTC 
sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 

//parse your input date string to UTC date 
Date gmtTime = new Date(sdf.parse(date)); 

Approccio 2: Utilizzo Joda orario (consigliato)

String dateString = "2015-08-21 03:15:00+5:30"; 

String pattern = "yyyy-MM-dd HH:mm:ssZ"; 

DateTimeFormatter dtf = DateTimeFormat.forPattern(pattern); 

DateTime dateTime = dtf.parseDateTime(dateString); 

System.out.println(dateTime); 
+1

Nel tuo codice non vedo che hai utilizzato il fuso orario GMT + 05: 30. Quello che hai scritto preleverà il fuso orario predefinito del server e lo convertirà in ora UTC. Diciamo che il tuo codice gira su un server che si trova nel fuso orario MST. Considererà la data 2015-08-21 03:15 come data MST e la convertirà in data UTC. Che è quello che non voglio So già che questa data è nel fuso orario GMT + 05: 30 cioè IST e ho bisogno di convertirla in ora UTC. –

+0

@HiteshBhutani .. Ho aggiornato la risposta, è necessario il tempo di Joda per gestire il caso +5: 30. – Garry

0

Un Date in Java rappresenta il numero di millisecondi dal 1970. Questo numero da solo non ha tempo orario specifico. Ciò significa che se si crea una data con new Date() si ottengono i millisecondi correnti dal 1970 e se si chiama toString su di esso questo valore viene rappresentato nel fuso orario locale corrente. L'ora effettiva rappresentata da questo numero è specifica del fuso orario. Questo è il motivo per cui è possibile impostare un Calendar su Calendar e formattare le classi.

creare un'istanza di un calendario con un fuso orario specifico si può fare questo:

public static Calendar getUtcCalendar() { 
    GregorianCalendar.getInstance(TimeZone.getTimeZone("UTC")); 
} 

Quindi, per convertire un Date a un tempo specifico in UTC fuso orario:

Calendar calendar = getUtcCalendar(); 
calendar.setTime(date); 
return calendar; 
0

Poiché si desidera solo una soluzione Java-8:

String input = "2015-08-21 03:15"; 
String offsetInfo = "GMT+05:30"; 

LocalDateTime ldt = 
    LocalDateTime.parse(input, DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm")); 
ZoneOffset offset = 
    ZoneOffset.of(offsetInfo.substring(3)); // GMT-prefix needs to be filtered out 

LocalDateTime result = 
    ldt.atOffset(offset).withOffsetSameInstant(ZoneOffset.UTC).toLocalDateTime(); 
System.out.print(result); // output: 2015-08-20T21:45 
Problemi correlati