【问题标题】:Single pattern for java 8 date time [duplicate]java 8日期时间的单一模式[重复]
【发布时间】:2019-01-17 09:26:13
【问题描述】:
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 秒和毫秒的模式?

【问题讨论】:

  • 为什么要接受 3 格式?我认为您应该选择一种格式,最好是 yyyy-MM-dd HH:mm:ss.SSS 并将其保留在整个应用程序中
  • 正如我上面提到的,它给出了一个 DateTimeParseException。
  • 检查重复标记问题的答案,它看起来是一个很棒的解决方案
  • 您知道您的代码无法编译吗?在 Stack Overflow 上发布问题(不是关于编译器错误消息)时,请确保它可以,以便我们可以尝试您的代码,看到它以您描述的方式失败,并在我们发布之前尝试我们建议的更正。我得到“模式无法解析为变量”和下一个“此方法必须返回 long 类型的结果”。

标签: java date parsing time java-8


【解决方案1】:

你可以选择一个默认三个 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

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

【讨论】:

  • 我不知道这个答案是否正确,但不要使用split 使用eventDate.substring(eventDate.lastIndexOf(".")+1)
  • @HadiJ 实际上编辑了我的答案 - thx ;)
  • 请注意,OP 必须决定 2018-07-19 23:11:52.3 中的 3 是指 3 毫秒还是 300 毫秒,以及相应的左右填充。
  • @nos 你完全不对。 23:11:52.3 总是 300 毫秒。 3 毫秒将是 23:11:52.003
  • @nos - 你在开玩笑吗?数学基础怎么样?什么毫秒代表“毫秒”?并且 0.3 并不意味着 1/3 ...除了没有基本数学知识的人构建了该文件:-)
【解决方案2】:

ISO 8601

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

所以,也许不要放空格,而是字母T 对你来说就足够了吗?

那么你根本不需要DateTimeFormatter

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

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

【讨论】:

  • ✔ 确实,我确认 LocalDateTime.parse( "2018-07-19T23:11:52.3" ).toString() 有效,在 Java 10.0.1 中产生 2018-07-19T23:11:52.300
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 2014-05-18
相关资源
最近更新 更多