2013-09-22 24 views
5

Aşağıda, saat dilimi bilgilerini içeren bir ISO8601 tarih dizesinin bir serileştirmesi var. (UTC offset)ISO8601 Saat dilimi bilgisi korunan DateTime için

scala> val date1 = new DateTime().withZone(DateTimeZone.forID("Europe/Berlin")) 
date1: org.joda.time.DateTime = 2013-09-22T18:42:15.348+02:00 

scala> date1.getZone() 
res45: org.joda.time.DateTimeZone = Europe/Berlin 

scala> val date2 = new DateTime(date1.toString()) 
date2: org.joda.time.DateTime = 2013-09-22T19:42:15.348+03:00 

scala> date2.getZone() 
res46: org.joda.time.DateTimeZone = Europe/Vilnius 

scala> date1.getZone() == date2.getZone() 
res47: Boolean = false 

Zaman dilimi bilgilerini +03:00 ve ISO8601 dizeleri sonunda +02:00 olduğu gibi tefrika, ancak seri kaldırma sonra kaybolur: saat dilimi bilgileri kaybolur dikkat edin. date1'un bir kopyası olması beklenen date2 DateTime nesnesini görebildiğiniz gibi, date1'un sahip olduğu +02:00 yerine sistemin UTC ofsetine sahiptir.

Bir ISO8601 dizgesini UTC ofsetini korumak için nasıl seri hale getirebilirim?

cevap

7

(aslında BaseDateTime aktarılır) Kullandığınız yapıcı, new DateTime(Object instant) (a String, senin durumunda) değil ayrıştırma, bunun yerine dönüştürür verilen nesneyi yok.

Uzun lafın kısası, kullandığı varsayılan saat dilimi:

  1. yapıcı geçti parametresi bir Instant dikkate alır ve talep yapıcı olduğunu StringConverter
  2. O metot üzerinde getInstantMillis() çağırır InstantConverter
  3. ConverterManager bir aslında bir ISO 8601 DateTimeFormatter, ancak parseit calls parseMillis() yerine kullanır. javadocs'dan görüldüğü gibi
  4. parseMillis, varsayılan saat dilimi'da bir tarih döndürür. yerine

Kullanım DateTime.parse:

DateTime date2 = DateTime.parse(date1.toString()); 
// 2013-09-22T19:21:48.461+02:00 
+0

Parlak! Zaten ISODateTimeFormat.dateTimeParser() .OffsetParsed(). ParseDateTime (dateTimeString) 'kullanarak bir yol bulmuştum, ama bu çok daha güzel gözlerde. Şerefe. –

+0

@DominykasMostauskis Harika! Son 20 dakikayı kod ayrıştırmada harcadım ve cevabımı bir açıklama ile güncelledim. Bunu bilmek her zaman iyidir * neden * bu şekilde çalışır. Bu yardımcı olur umarım. Eğer yardımcı olsaydı yeniyi eklemeyi unutma :) – Nicole

+0

+1, emin oldun;) –