SimpleDateFormat 到 java.time

SimpleDateFormat to java.time

我正在尝试了解 Java 8 date/time 框架的工作原理。
我实际上以这种方式使用 SimpleDateFormat 给定一个字符串 return 毫秒:

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

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

您可以使用:

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

您指定的模式在 Java-8 中无效。问题是 fixed in Java-9 似乎没有向后移植,但 Java-9 尚未发布。

Java-8 的可能 解决方法包括笨拙的字符串预处理,即在小数部分之前插入小数分隔符或下载其他第 3 方库(根据我的观察,解析器可能仍然比 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 需要明确指定时区(恕我直言,设计更简洁)。