2014-09-17 30 views
11

Java 8'de, datetime'ı UTC'den ACST'ye (UTC + 9: 30) dönüştürmek istiyorum.Java 8 zaman dilimi dönüşümü

girdi - 2014-09-14T17>: 00: 00 + 00: 00

output-> 02:30:00

String isoDateTime = "2014-09-14T17:00:00+00:00"; 
LocalDateTime fromIsoDate = LocalDateTime.parse(isoDateTime, DateTimeFormatter.ISO_OFFSET_DATE_TIME); 

ZoneOffset offset = ZoneOffset.of("+09:30"); 
OffsetDateTime acst = OffsetDateTime.of(fromIsoDate, offset); 
System.out.println(acst.toString()); // 2014-09-14T17:00+09:30 
System.out.println(acst.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)); // 2014-09-14T17:00:00+09:30 

2014-09-15 Neden gerçekleştirilmez ofset edilir ?

cevap

17

Dene:

String isoDateTime = "2014-09-14T17:00:00+00:00"; 
ZonedDateTime fromIsoDate = ZonedDateTime.parse(isoDateTime); 
ZoneOffset offset = ZoneOffset.of("+09:30"); 
ZonedDateTime acst = fromIsoDate.withZoneSameInstant(offset); 

System.out.println("Input: " + fromIsoDate); 
System.out.println("Output: " + acst.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)); 

Çıktı: Yukarıda üzerinde

Input: 2014-09-14T17:00Z 
Output: 2014-09-15T02:30:00+09:30 
1

hafif iyileşme. Hardcoding ofsetini engeller. Ayrıca, gün ışığından yararlanma ile ilgilenir.

public static LocalDateTime convertTo(LocalDateTime dateTime, String timeZone) { 
    ZoneId zone = ZoneId.of(timeZone); 
    ZonedDateTime zdt = dateTime.atZone(zone); 
    ZoneOffset offset = zdt.getOffset(); 
    return dateTime.plus(offset.getTotalSeconds(), ChronoUnit.SECONDS); 
} 
+2

Bu bir desen karşıtıdır, saat dilimi kaydırıldıktan sonra "Yerel" bir DateTime döndürmemelisiniz. – Naufal