2015-05-19 15 views
9

Przechowuję znaczniki daty w DB jako wartość UTC, a odzyskiwanie to muszę wykonać jako czas UTC i trzeba przekonwertować na konkretną wartość strefy czasowej.Jak pobrać datownik jako datę UTC

tj 1.05.2015 00: 09: 30: 00 czasu UTC trzeba konwertować do IST (lub innej strefy czasowej)

resultSet.getDate("VisitDate") 

proszę o pomoc w tej sprawie.

Odpowiedz

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 może zmienić łańcuch UTC na dowolny znany ciąg strefy czasowej, aby otrzymać ten mate. Wykonaj głosowanie, jeśli jest to pomocne. do zmiany strefy czasowej można użyć tej funkcji

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); 
} 

cieszyć :-)

+0

Teraz można użyć drugiego funkcję w przedostatnim wierszu można podać datę UTC do dalszej przemiany. –

9

Java 8

Można użyć ZonedDateTime ustawiony na UTC, a następnie przełożyć je do LocalDateTime pomocą czegoś podobnego. ..

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

Oczywiście mam użytkowania ZoneId.systemDefault() w przykładzie (konwersja strefową datę/czas, aby lokalnej dAT e/czas), ale można przekazać co kiedykolwiek strefy chcesz/potrzebujesz

Joda-Time

i podobnie z Joda-Time, jeśli nie używasz Java 8

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

Jedną z rzeczy, która nie jest do końca słuszna, jest to, że zakłada, że ​​domyślny "kalendarz" db jest w UTC, ale może nie być. Na przykład w h2 domyślnym 'Calendar' jest' Calendar.getInstance() ', który jest kalendarzem systemowym. Co należy zrobić, to 'ZoneId dbZoneId = ZoneId.of (" Europe/London "); Kalendarz dbCalendar = Calendar.getInstance (TimeZone.getTimeZone (dbZoneId)); TimeStamp ts = resultSet.getTimestamp ("VisitDate", dbCalendar); '. Spowoduje to pobranie instancji 'Timestamp' przy użyciu kalendarza, który był używany do przechowywania pola w pierwszej kolejności. –

+0

Po prostu wyjaśniam moją wcześniejszą uwagę. Może to stać się oczywiste, jeśli baza danych h2 zostanie utworzona w jednej strefie, a następnie skopiowana do komputera w innej strefie. Proces, który utworzył dane, zapisałby to w Wielkiej Brytanii 'Timestamp's, odczyt procesu będzie domyślnie czytał je tak, jakby były AU' Timestamp's. –

+0

@ BrettRyan W tym momencie dobrym pomysłem jest przechowywanie czasu w centralnie zdefiniowanej strefie czasowej: P – MadProgrammer

1

jak ty powiedział podczas lodaing do DB ustawiasz jako UTC strefy czasowej, ale kiedy retriving strefę czasową z powrotem z DB nie może być UTC ponownie jako sklep DB przyzwyczajenie informacji Timezone więcej szczegółów kasy ten link Dealing with Timezones in DB

zgodnie więc, że może gnić urna strefę czasową lokalnych ustawień serwera strefy czasowej JVM lub DB.

Zresztą do zmiany strefy czasowej, jak wspomniano w innych odpowiedzi można użyć SimpleDateFormat

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