您指定的模式在Java-8中无法工作。该问题已在Java-9中
得到修复,但似乎没有回溯到Java-8,而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);
System.out.println(date.toInstant().toEpochMilli());
Joda-Time:
String mydate = "20130812214600025";
DateTime date =
DateTime.parse(
mydate,
DateTimeFormat.forPattern("yyyyMMddHHmmssSSS"));
System.out.println(date);
System.out.println(date.toInstant().getMillis());
My library 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);
供您参考:时区信息是必要的,因为我们将本地的年、月、日、小时等细节转换为全球瞬间,但您的输入不包含任何区域或偏移信息。因此,必须向格式化程序提供一个区域或偏移量。
正如您所见,SimpleDateFormat 和 Joda-Time 默认(隐式地)使用系统时区。然而,java.time-API 和 Time4J 要求显式指定时区(在我看来这是更清晰的设计)。
T
,(b)在小数秒之前插入逗号(最好)或句号(周期)。 - Basil Bourque