繁体   English   中英

SimpleDateFormat转换为java.time

[英]SimpleDateFormat to java.time

我试图了解Java 8日期/时间框架的工作原理。
我实际上是通过这种方式使用SimpleDateFormat返回给定字符串的毫秒数:

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

Java 8中的新类会变成什么样?

您指定的模式无法在Java-8中使用。 在Java-9中 ,似乎没有反向移植已解决了该问题,但是Java-9尚未发布。

Java-8可能的解决方法包括笨拙的字符串预处理,即在小数部分前插入小数点分隔符或下载其他3rd-party-libraries(根据我的观察,解析器可能仍比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和Time4J要求显式指定时区(IMHO更为简洁的设计)。

您可以使用:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM