2017-02-23 86 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