【问题标题】:Converting a string to localDateTime not working as intended and getting parsing exceptions [duplicate]将字符串转换为 localDateTime 无法按预期工作并获取解析异常[重复]
【发布时间】:2020-12-15 04:25:54
【问题描述】:

尝试将字符串转换为 localDateTime 并查看日期是否超过一年。我知道它应该工作,但它不工作。在索引“i”处获取解析异常

LocalDateTime currentTimeLastYear = LocalDateTime.now().minusYears(1);

String pattern = "MM/dd/yyyy'T'HH:mm:s";

// ex "8/30/2019T15:51:5"
String queryToDate = query.getDateRange().getToDate();

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
LocalDateTime localDateTime = LocalDateTime.parse(queryToDate, formatter);
System.out.println(localDateTime);

if(localDateTime.isBefore(currentTimeLastYear)) {
    return true;
}    

【问题讨论】:

  • 日期字符串的格式显然不是MM/dd/yyyy。两个Ms 表示月份为个位数时会有前导0。
  • 使用String pattern = "M/dd/yyyy'T'HH:mm:s";

标签: java time


【解决方案1】:

在格式模式中为单个数字值省略填充零的每个部分使用单个字母。

如果月份是8 而不是08,请使用M 而不是MM

Javadoc 文档中对此进行了解释:

如果字母数为 1,则使用最小位数输出值且不进行填充。否则,将使用位数作为输出字段的宽度,并根据需要将值补零。

String input = "8/23/2021T1:23:7"
DateTimeFormatter f = DateTimeFormatter.ofPattern( "M/d/uuuu'T'H:m:s" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;

看到这个code run live at IdeOne.com

ldt.toString() = 2021-08-23T01:23:07

提示:教育您的数据发布者遵守ISO 8601 并始终使用填充零。您的输入似乎是对 ISO 8601 的错误尝试。

【讨论】:

  • 知道了。我对java相当陌生。如果您不介意,请快速提问:使用单个字母确实可以按照您的说明使用,但是如果它们存在并且模式“M/d/uuuu'T'H:m:s”,它将排除毫秒:2020-12- 14T23:38:46.269
  • @Gunther 你没有在你的问题中提到任何几分之一秒。你真的应该在那里给出示例输入。
  • 我先试试看再问。我只是好奇而已。你已经回答了我原来的问题。谢谢
  • @Gunther 发帖前先搜索一下。大多数关于日期时间处理的基本问题都已在 Stack Overflow 上被多次询问和回答。
猜你喜欢
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
  • 2020-07-11
  • 1970-01-01
  • 2020-04-23
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多