我试图了解Java 8日期/时间框架是如何工作的。
实际上,我使用SimpleDateFormat这种方式返回给定字符串的毫秒:
new SimpleDateFormat("yyyyMMddHHmmssSSS").parse(builder.toString()).getTime();Java 8中的新类会变成什么样子?
发布于 2017-02-24 08:19:46
您指定的模式无法在Java-8中工作。问题是似乎没有后台的用Java-9修正,但是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()); // 1376336760025Joda-Time
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需要显式指定时区(IMHO是更干净的设计)。
发布于 2017-02-23 20:57:56
您可以使用:
ZonedDateTime date = ZonedDateTime.parse("mydate",DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
System.out.println(date.toInstant().toEpochMilli());https://stackoverflow.com/questions/42425927
复制相似问题