Java 8日期时间的单一模式

时间:2018-08-09 20:09:18

标签: java date parsing time java-8

public static long convertDateTimeToEpochMillis(String eventDate,String eventTime) {
    String patternMills = "yyyy-MM-dd HH:mm:ss.SSS";           
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern(pattern);
    LocalDateTime localDateTime = LocalDateTime.parse(eventDate + " " + 
    eventTime, dtf);
}

当我传递2018-07-19 23:11:52.3但成功解析2018-07-19 23:11:52.312时,这给出了解析异常。我不想为不同的时间指定3种不同的模式,例如yyyy-MM-dd HH:mm:ss.Syyyy-MM-dd HH:mm:ss.SSyyyy-MM-dd HH:mm:ss.SSS

我可以提供一个模式,该模式最多花费1/10秒,100秒和毫秒吗?

2 个答案:

答案 0 :(得分:3)

ISO 8601

实际上,使用标准LocalDateTime.parse格式,您的模式离ISO 8601默认模式不远。

那么,也许不放空格而是使用字母T对您来说足够了?

那么您根本不需要DateTimeFormatter

LocalDateTime localDateTime = LocalDateTime.parse(eventDate + "T" + 
eventTime);

它接受以毫秒为单位的任意数字,从0到9。

答案 1 :(得分:2)

您可以选择默认三个SSS的图案

String patternMills = "yyyy-MM-dd HH:mm:ss.SSS"; 

并在必要时用零填充日期右侧

String eventDate = "2018-07-19 23:11:52.3";
String millis = eventDate.substring(eventDate.lastIndexOf('.')+1);

if(millis.length() < 3) 
    eventDate += Stream.generate(() -> "0").limit(3 - millis.length()).collect(Collectors.joining(""));

或使用漂亮的apache方法:

StringUtils.rightPad(eventDate, 23, '0'); // 23 is string length for "yyyy-MM-dd HH:mm:ss.SSS" pattern

无论如何,您还可以添加一些验证来检查日期字符串的其余部分