2015-05-19 8 views
9

Sto memorizzando data e ora in DB come valore UTC, mentre recuperandolo ho bisogno di fare come ora UTC e ho bisogno di convertire in un valore specifico del fuso orario.come faccio a recuperare data/ora come UTC

cioè 2015/05/01 00: 09: 30: 00 ora UTC necessario convertire a IST (o altro fuso orario)

resultSet.getDate("VisitDate") 

si prega di aiuto su questo.

risposta

1
private final static String DATEFORMAT = "yyyy-MM-dd HH:mm:ss"; 
public static String getCurrentTimeInUTC(){ 

    final SimpleDateFormat sdf = new SimpleDateFormat(DATEFORMAT); 
    sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 
    final String utcTime = sdf.format(new Date()); 


    return utcTime; 

} 

U può cambiare la stringa UTC in qualsiasi stringa di fuso orario nota per ottenere quel formato. Votare se questo è utile. per cambiare il fuso orario è possibile utilizzare questa funzione

public static String getLocalTime(String timeZone) throws ParseException{ 
    DateFormat formatter = null; 
     Date convertedDate = null; 

     DateFormat outputFormat=new SimpleDateFormat(DATEFORMAT); 
     formatter = new SimpleDateFormat(DATEFORMAT); 
     formatter.setTimeZone(TimeZone.getTimeZone(timeZone)); 
     convertedDate = (Date) formatter.parse(getCurrentTimeInUTC()); 
     return outputFormat.format(convertedDate); 
} 

Godetevi :-)

+0

Ora è possibile utilizzare la seconda funzione come nel secondo all'ultima riga si può dare la data UTC per ulteriore conversione. –

9

Java 8

È possibile utilizzare un set ZonedDateTime per UTC e poi tradurlo in un LocalDateTime utilizzando qualcosa di simile. ..

java.sql.Timestamp ts = resultSet.getTimestamp("VisitDate"); 
ZonedDateTime utcDateTime = ZonedDateTime.ofInstant(ts.toInstant(), ZoneId.of("UTC")); 
LocalDateTime localDateTime = utcDateTime.withZoneSameInstant(ZoneId.systemDefault()).toLocalDateTime(); 

Ovviamente, ho l'uso ZoneId.systemDefault() nell'esempio (convertire la data/ora suddivisa in zone per dat locali e/ora), ma è possibile passare cosa mai zona che si desidera/bisogno

Joda Time

E allo stesso modo con Joda-Time se non si sta usando Java 8

java.sql.Timestamp ts = resultSet.getTimestamp("VisitDate"); 
LocalDateTime utcDateTime = new LocalDateTime(ts, DateTimeZone.UTC); 
DateTime hereDateTime = utcDateTime.toDateTime(DateTimeZone.getDefault()); 
+0

Una cosa che non ha proprio ragione è che presuppone che il 'calendario' predefinito di db sia in UTC, ma potrebbe non essere il caso. Ad esempio in h2 il 'Calendar' predefinito è' Calendar.getInstance() 'che è il calendario dei sistemi. Quello che si deve fare è 'ZoneId dbZoneId = ZoneId.of (" Europe/London "); Calendar dbCalendar = Calendar.getInstance (TimeZone.getTimeZone (dbZoneId)); TimeStamp ts = resultSet.getTimestamp ("VisitDate", dbCalendar); '. In questo modo verrà recuperata l'istanza "Timestamp" utilizzando il calendario utilizzato per memorizzare il campo in primo luogo. –

+0

Basta chiarire il mio commento precedente. Questo può diventare evidente se il database h2 viene creato in una zona, quindi copiato su una macchina in un'altra zona. Il processo che ha creato i dati avrebbe memorizzato questo con 'Timestamp' Regno Unito, la lettura del processo per impostazione predefinita li leggerà come se fossero AU' Timestamp's. –

+0

@BrettRyan Qui è dove avere il tempo memorizzato in un fuso orario definito centralmente è una buona idea: P – MadProgrammer

1

Come si detto mentre lodaing in DB che si sta configurando come fuso orario UTC, ma quando retriving il fuso orario di ritorno da DB non può essere UTC di nuovo come archivio DB solito informazioni sul fuso orario per ulteriori dettagli checkout questo link Dealing with Timezones in DB

Quindi, secondo che potrebbe macerare urn il fuso orario delle impostazioni locali del fuso orario del server JVM o DB locale.

ogni modo per cambiare il fuso orario, come detto in altre Risposta Puoi usare il SimpleDateFormat

final SimpleDateFormat sdf = new SimpleDateFormat(DATEFORMAT); 
sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 
final String utcTime = sdf.format(new Date()); 
Problemi correlati