2017-02-23 87 views
2

我想了解Java 8的日期/時間框架是如何工作的。
實際上,我使用的SimpleDateFormat這種方式返回給一個字符串毫秒:SimpleDateFormat到java.time

new SimpleDateFormat("yyyyMMddHHmmssSSS").parse(builder.toString()).getTime(); 

將它變成什麼在Java 8中的新類?

+1

您所需的格式接近標準[ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)格式。我強烈建議堅持使用標準格式,而不是自己創造。該標準明智地設計,以避免歧義。這些默認情況下在java.time類中用於解析/生成字符串。您的格式接近「基本」版本,最大限度地減少分隔符的使用。爲了完全符合,(a)在年月日和小時分之間插入一個'T',並且(b)在小數秒之前插入一個逗號(最好)或一個完整的(句號) 。 –

回答

2

您指定的格局也不會在Java-8的工作。問題是fixed in Java-9似乎沒有backport,但Java-9尚未發佈。

可能的解決方法的Java-8要麼包括彆扭串預處理,即插入的小數部分之前小數分隔或下載其他第三方的庫(其中解析器可能仍然比根據Java的9更快我觀察):

字符串預處理

String mydate = "20130812214600025"; 
String adjustedInput = new StringBuilder(mydate).insert(14, '.').toString(); 
ZonedDateTime date = 
    ZonedDateTime.parse(
     adjustedInput, 
     DateTimeFormatter.ofPattern("yyyyMMddHHmmss.SSS").withZone(ZoneOffset.systemDefault())); 
System.out.println(date); // 2013-08-12T21:46:00.025+02:00[Europe/Berlin] 
System.out.println(date.toInstant().toEpochMilli()); // 1376336760025 

喬達時間

String mydate = "20130812214600025"; 
DateTime date = 
    DateTime.parse(
     mydate, 
     DateTimeFormat.forPattern("yyyyMMddHHmmssSSS")); 
System.out.println(date); // 2013-08-12T21:46:00.025+02:00 
System.out.println(date.toInstant().getMillis()); // 1376336760025 

我的圖書館Time4J

long millisSinceUnix = 
    ChronoFormatter.ofPattern(
     "yyyyMMddHHmmssSSS", 
     PatternType.CLDR, 
     Locale.ROOT, 
     Moment.axis(TemporalType.MILLIS_SINCE_UNIX) 
    ).with(Timezone.ofSystem()).parse(mydate).longValue(); 
System.out.println(millisSinceUnix); // 1376336760025 

爲了您的信息:需要的時區,因爲我們把當地的細節,如年,月,日,小時等爲全球即時但是您輸入不包含任何區域或偏移量信息。因此,有必要爲格式化程序提供區域或偏移量。

如您所見,SimpleDateFormat和Joda-Time默認使用系統時區(隱式)。然而,java.time -API和Time4J需要明確指定一個時區(恕我直言,清潔設計)。

1

您可以使用:

ZonedDateTime date = ZonedDateTime.parse("mydate",DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")); 
System.out.println(date.toInstant().toEpochMilli()); 
+1

This give me: Text'20140920111703000'could not beneath the index 0 – LppEdd