如何用java中的两个或三个毫秒数字解析日期时间?

bra*_*orm 7 java datetime-format datetime-parsing java-time dateformatter

这是我将String解析成的方法LocalDateTime.

    public static String formatDate(final String date) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS");
        LocalDateTime formatDateTime = LocalDateTime.parse(date, formatter);
        return formatDateTime.atZone(ZoneId.of("UTC")).toOffsetDateTime().toString();
    }
Run Code Online (Sandbox Code Playgroud)

但这仅适用于输入字符串, 2017-11-21 18:11:14.05 但无法2017-11-21 18:11:14.057 使用DateTimeParseException.

如何定义适用于.SS.SSS?的格式化程序?

Sle*_*idi 13

您需要构建具有指定分数的格式化程序

DateTimeFormatterformatter formatter = new DateTimeFormatterBuilder()
  .appendPattern("yyyy-MM-dd HH:mm:ss")
  .appendFraction(ChronoField.MILLI_OF_SECOND, 2, 3, true) // min 2 max 3
  .toFormatter();

LocalDateTime formatDateTime = LocalDateTime.parse(date, formatter);
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 9

tl;博士

根本不需要定义格式化程序。

LocalDateTime.parse(
    "2017-11-21 18:11:14.05".replace( " " , "T" )
)
Run Code Online (Sandbox Code Playgroud)

ISO 8601

Sleiman Jneidi答案特别聪明和高科技,但还有一个更简单的方法。

调整您的输入字符串以符合 ISO 8601 格式,这是 java.time 类中默认使用的格式。所以根本不需要指定格式模式。默认格式化程序可以处理小数秒的零(整秒)和九(纳秒)之间的任意数量的十进制数字。

您的输入几乎符合要求。只需将中间的 SPACE 替换为T.

String input = "2017-11-21 18:11:14.05".replace( " " , "T" );
LocalDateTime ldt = LocalDateTime.parse( input );
Run Code Online (Sandbox Code Playgroud)

ldt.toString(): 2017-11-21T18:11:14.050


在此处输入图片说明


Ole*_*.V. 6

通过这些问题的答案罗勒布尔克苏莱曼Jneidi都非常优秀。我只想指出,EMH333的回答也有一个要点:对问题代码进行以下非常简单的修改就可以解决您的问题。

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.[SSS][SS]");
Run Code Online (Sandbox Code Playgroud)

格式模式字符串中的方括号包含可选部分,因此该格式接受以秒为单位的3或2个小数。

  • 相对于Basil Bourque答案的潜在优势:提供更好的输入验证,如果秒数只有1个或小数点后有4个小数,则该对象将反对(这是否占优势完全取决于您的情况)。
  • 优于Sleiman Jneidi的答案:您不需要构建器。

可能的缺点:它完全不接受小数(只要有小数点)。

正如我所说,其他解决方案也非常好。您更喜欢哪一个主要取决于品味。