如何解决无法解析时间戳问题java.time.format.DateTimeParseException:无法在索引0处解析文本'9/25/2020,12:46:00 PM'
我试图捕获在检查网页上的时间戳值之前和之后的时间,然后确认我的时间戳介于这些时间之间。但是,我正在努力以一种干净的方式将String时间戳转换为可比较的格式。
Instant b4 = Instant.Now();
//My code submites a file that then triggers the timestamp. I retrieve it as a string
//exa string"9/25/2020,11:03:18 AM"
DateTimeFormatter dtf = DateTimeFormatter
.ofPattern("MM/dd/yyyy,HH:mm:ss a")
.withZone(ZoneId.systemDefault());
Instant instantTimestamp = Instant.from(dtf.parse(timeStamp));
Instant after = Instant.Now();
if (instantTimestamp.isAfter(b4) && instantTimestamp.isBefore(after)) {
testPass = true;
}
Assert.assertTrue(testPass);
我的错误: java.time.format.DateTimeParseException:无法在索引0处解析文本“ 9/25 / 2020,12:46:00 PM”
解决方法
该错误是由于使用了格式字符串。 “ MM”要求输入字符串的月份部分恰好是两位数,而“ 9”只是一位数字。换句话说,它适用于“ 09/25 / 2020,11:03:18 AM”,但不适用于“ 9/25 / 2020,11:03:18 AM”。
这里需要的是“ M”,它不需要在值前加上“ 0”:
DateTimeFormatter dtf = DateTimeFormatter
.ofPattern("M/dd/yyyy,HH:mm:ss a")
.withZone(ZoneId.systemDefault());
如果还应允许日期为一位数字,并且在0-9天不填充0,则应使用"M/d/yyyy,HH:mm:ss a"
模式。
这是对DateTimeFormatter
Javadocs的描述:
所有字母“ A”至“ Z”和“ a”至“ z”均保留为图案字母。定义了以下模式字母:
Symbol Meaning Presentation Examples ------ ------- ------------ ------- [...] M/L month-of-year number/text 7; 07; Jul; July; J [...]
文本: [...]
数字:如果字母数为1,则使用最少的数字位数输出该值,并且不带填充。否则,将数字计数用作输出字段的宽度,并在必要时将值补零。 [...]
数字/文本::如果图案字母的数量为3个或更多,请使用上面的“文本”规则。否则,请使用上面的数字规则。
由于“ M”使用“数字/文本”表示形式,并且其格式(“ MM”)的字母计数为2,所以该月的数字正好需要两位数字。将其切换为单个“ M”会使其使用最少的数字(1到9个月为一位,而10到12个月为两位)。
,月份的格式与字符串中的值不匹配。格式为MM
,它指定两位数字,但值是9
,它是一位数字。您可以将单个字母用于月,日,年,时,分,秒等,以容纳所有允许的数字位数。另外,我建议您以不区分大小写的方式对其进行解析,以便可以同时使用大写和小写(例如AM
和am
)。
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
// Given date-time string
String dateTimeString = "9/25/2020,12:46:00 PM";
DateTimeFormatter dtf = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("M/d/u,H:m:s a")
.toFormatter(Locale.ENGLISH);
// Convert the given date-time string to LocalDateTime
LocalDateTime ldt = LocalDateTime.parse(dateTimeString,dtf);
System.out.println(ldt);
//Convert to LocalDateTime Instant if required
Instant instant=ldt.toInstant(ZoneOffset.UTC);
System.out.println(instant);
}
}
输出:
2020-09-25T12:46
2020-09-25T12:46:00Z
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。