2016-01-05 18 views
16

"2015-01-05 17:00" ve ZoneId"Australia/Sydney" gibi dize türünde bir sürem var.Java 8 Verilen zaman ve zaman dilimini UTC zamanına dönüştürme

Java 8 datetime API'yi kullanarak bu zaman bilgisini UTC saatine karşılık nasıl dönüştürebilirim? Ayrıca, DST maddelerini dikkate almanız gerekir.

+1

"UTC Time" ile ne demek istiyorsunuz? Anında ister misin? veya bir java.sql.Date? Ya da çağdan bu yana birkaç milis? – assylias

cevap

32

Java8'de ZonedDateTime sınıfını arıyorsunuz - saat dilimi ve UTC/Greenwich'ten çözülmüş ofset ile tam bir tarih zamanı. Tasarım açısından, bu sınıf öncelikle LocalDateTime ve ZoneId'un bir kombinasyonu olarak görülmelidir. ZoneOffset, özellikle gün ışığından tasarruflar sırasında sınıfın bir anı temsil etmesini sağlamak için kullanılan hayati ama ikincil bir bilgi parçasıdır. Örneğin

:

ZoneId australia = ZoneId.of("Australia/Sydney"); 
String str = "2015-01-05 17:00"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); 
LocalDateTime localtDateAndTime = LocalDateTime.parse(str, formatter); 
ZonedDateTime dateAndTimeInSydney = ZonedDateTime.of(localtDateAndTime, australia); 

System.out.println("Current date and time in a particular timezone : " + dateAndTimeInSydney); 

ZonedDateTime utcDate = dateAndTimeInSydney.withZoneSameInstant(ZoneOffset.UTC); 

System.out.println("Current date and time in UTC : " + utcDate); 
+1

Bu sonuç istediğim gibi değil. UTC saatine dönüştürmek ve veritabanımda UTC saatini kaydetmek istiyorum. ZonedDateTime istediğim gibi değil ve DB sütun türüyle eşlenemiyor. – ttt

+2

Üzgünüz, örneğin UTC'ye dönüşüm ekledim. –

+2

Cool, LocalDateTime'ı ZonedDateTime'a dönüştürmeliyiz ve sonra farklı saat dilimi arasında dönüştürebiliriz. Teşekkürler. – ttt

15
mevcut yanıtlardan bir alternatif kurulum için uygun bir zaman diliminde ile biçimlendirici olan

: Bir veritabanı ile etkileşime istediğimizden

String input = "2015-01-05 17:00"; 
ZoneId zone = ZoneId.of("Australia/Sydney"); 

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").withZone(zone); 
ZonedDateTime utc = ZonedDateTime.parse(input, fmt).withZoneSameInstant(UTC); 

, ihtiyacınız olabilecek bir java.sql.Timestamp, bu durumda açıkça bir UTC süresine dönüştürmeniz gerekmez, ancak bunun yerine bir Anında Anlık İleti'yi kullanabilirsiniz:

ZonedDateTime zdt = ZonedDateTime.parse(input, fmt); 
Timestamp sqlTs = Timestamp.from(zdt.toInstant()); 
+0

Bu bağlamda UTC değişkeni nedir? – BOWS

+1

Sydney'de "giriş" ile aynı anıya karşılık gelen UTC saat diliminde bir tarih/saat. Yani bu durumda, aynı tarih olacak ama saat 6'da olacak. – assylias

0
**// Refactored Logic**  

     ZoneId australia = ZoneId.of("Australia/Sydney"); 
     ZoneId utcZoneID= ZoneId.of("Etc/UTC"); 
     String ausTime = "2015-01-05 17:00"; 
     DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); 

     //converting in datetime of java8 
     LocalDateTime ausDateAndTime = LocalDateTime.parse(ausTime, formatter); 

     // DateTime With Zone 
     ZonedDateTime utcDateAndTime = ausDateAndTime.atZone(utcZoneID); 
     // output - 2015-01-05T17:00Z[Etc/UTC] 

     // With Formating DateTime 
     String utcDateTime = utcDateAndTime.format(formatter); 
     // output - 2015-01-05 17:00 
İlgili konular