2015-06-11 13 views
6

Dizede nanoOfSeconds olabilecek veya bulunmayabilecek bir dize LocalTime (java-8 not joda) dönüştürmem gerekiyor. Dize formatı 07:06:05 veya 07:06:05.123456 biçimindedir. Dize saniyeler içinde ondalık bir yere sahip olabilir veya olmayabilir ve Nano Saniye bölümünü temsil edecek herhangi bir sayıda karakter olabilir.NanoOfSeconds ile/olmadan LocalTime'a String Dizesi

DateTimeFormatter dtf; 
if (time1.contains(".") { 
    dtf = DateTimeFormatter.ofPattern("H:mm:ss.SSSSSS); 
} else { 
    dtf = DateTimeFormatter.ofPattern("H:mm:ss); 
} 

Bu iyi çalışır ve: Ben gibi iki biçimleri arasında ayrım yapmak bir IF deyimi kullanabilirsiniz böyle

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("H:mm:ss"); 

veya

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("H:mm:ss.SSSSSS"); 

gibi bir DateTimeForamtter kullanılması

Ben bununla Tamam ama ondalık poin sonra çeşitli sayıda pozisyonları kullanabilmek gerekir t.

örnek bir veri seti olabilir:

[11:07:59.68750, 11:08:00.781250, 11:08:00.773437500, 11:08:01] 

biçimlendirici ondalık basamak sayısı bilinmeyen olduğunda bir java.time.format.DateTimeParseException atma olmadan ondalık sonra herhangi bir sayıda rakam ayrıştırmak için izin vermek için bir yolu var mı?

Gerçekten basit bir şeyi kaçırmayı umuyorum.

+0

İlk soruyu yanıtlamak için, basitçe 'if (stringValue.length()> 7) dizesinin uzunluğunu test edebilirsiniz. {// ikinci biçimlendiriciyi kullan} else if (stringValue.length() == 7) {// birinci biçimlendiriciyi kullan} "İkinci soruyu anladığımdan emin değilim, detaylandırır mısınız? –

+1

Ikinci ya da ben anlamadım - Ben ilk :) cevabım verilen cevapsız olduğunu umuyorum –

+0

Belirli bir yeri kontrol etmek ve buna dayalı bir format karar vermek için çirkin görünüyor. Karakter sayısında biraz daha az katı olan bir biçimlendiriciye sahip olmak için mantıklı görünüyor (ancak yine dizelerle uğraşıyoruz) – jbolt

cevap

16

. LocalTime.parse(String) zaten opsiyonel nanosaniye kolları:

System.out.println(LocalTime.parse("10:15:30")); 
System.out.println(LocalTime.parse("10:15:30.")); 
System.out.println(LocalTime.parse("10:15:30.1")); 
System.out.println(LocalTime.parse("10:15:30.12")); 
System.out.println(LocalTime.parse("10:15:30.123456789")); 

Yukarıdaki tüm ayrıştırma ince, ayrıca Javadocspec görüyoruz.

5

Bunun için biçim örüntüsünün "İsteğe bağlı bölümler" kullanabilirsiniz: bu formatı ayrıştırmak için özel bir şey yapmaya gerek yoktur

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("H:mm:ss[.SSSSSS]"); 
+0

Evet ama bu bana çeşitli miktarda ondalık basamak vermeme izin verecek mi? – jbolt

+2

@jbolt: Ne demek istediğini açıklamak için sorunuzu açıklığa kavuşturursanız yardımcı olur. –

+0

soru 2, ondalıktan sonra bilinmeyen sayıda yeri ayrıştırmam gerekiyordu. 0 veya daha fazla yer olabilir (ondalık dahil edilemez) bu nedenle iki farklı zaman imzası vardır – jbolt