时间戳可以';无法解析问题java.time.format.DateTimeParseException:Text';2020年9月25日,下午12:46:00';无法在索引0处分析

时间戳可以';无法解析问题java.time.format.DateTimeParseException:Text';2020年9月25日,下午12:46:00';无法在索引0处分析,java,time,datetime-format,java.time.instant,datetimeformatter,Java,Time,Datetime Format,Java.time.instant,Datetimeformatter,我试图捕获在检查网页上的时间戳值之前和之后的时间,然后确认我的时间戳在这两个时间之间。然而,我正在努力以一种干净的方式将我的字符串时间戳转换成一种类似的格式 Instant b4 = Instant.now(); //My code submites a file that then triggers the timestamp. I retrieve it as a string //exa 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
,为一位数字。您可以使用单字母表示月、日、年、小时、分钟、秒等,以容纳所有允许的位数。此外,我建议您以不区分大小写的方式对其进行解析,以便可以同时容纳大写和小写(例如,
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

月份的格式与其字符串中的值不匹配。格式为
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

错误是由于正在使用的格式字符串引起的。“MM”要求输入字符串的月份部分正好是两位数,但“9”仅为一位数。换句话说,它适用于“09/25/2020,11:03:18 AM”,但不适用于“9/25/2020,11:03:18 AM”

这里需要的是“M”,它不要求值前面加“0”:

DateTimeFormatter dtf=DateTimeFormatter
模式的名称(“年月日,HH:mm:ss a”)
.withZone(ZoneId.systemDefault());
如果第0-9天的日期也应允许为一位数字,而不是0填充,则应使用
“M/d/yyyy,HH:mm:ss a”
模式

Javadocs对此进行了描述:

所有字母“A”至“Z”和“A”至“Z”保留为图案字母。定义了以下模式字母:

符号含义表示示例
------  -------                     ------------      -------
[...]
M/L年度月份编号/文本7;07; 7月;七月,;J
[...]
文本:[…]

数字:如果字母计数为一,则使用最小位数输出该值,且无填充。否则,数字计数用作输出字段的宽度,并根据需要填充值零。[……]

数字/文本:如果图案字母的计数为3或更多,请使用上述文本规则。否则,请使用上面的数字规则


由于“M”使用“数字/文本”表示,且其字母计数(您的格式(“MM”)为2,因此该月需要正好两位数字。将其切换为单个“M”会使其使用最小位数(1-9个月为一位数,10-12个月为两位数)。

错误是由于使用了格式字符串。“MM”要求输入字符串的月份部分正好是两位数,但“9”仅为一位数。换句话说,它适用于“09/25/2020,11:03:18 AM”,但不适用于“9/25/2020,11:03:18 AM”

这里需要的是“M”,它不要求值前面加“0”:

DateTimeFormatter dtf=DateTimeFormatter
模式的名称(“年月日,HH:mm:ss a”)
.withZone(ZoneId.systemDefault());
如果第0-9天的日期也应允许为一位数字,而不是0填充,则应使用
“M/d/yyyy,HH:mm:ss a”
模式

Javadocs对此进行了描述:

所有字母“A”至“Z”和“A”至“Z”保留为图案字母。定义了以下模式字母:

符号含义表示示例
------  -------                     ------------      -------
[...]
M/L年度月份编号/文本7;07; 7月;七月,;J
[...]
文本:[…]

数字:如果字母计数为一,则使用最小位数输出该值,且无填充。否则,数字计数用作输出字段的宽度,并根据需要填充值零。[……]

数字/文本:如果图案字母的计数为3或更多,请使用上述文本规则。否则,请使用上面的数字规则

由于“M”使用“数字/文本”表示,且其字母计数(您的格式(“MM”)为2,因此该月需要正好两位数字。将其切换为单个“M”会使其使用最小位数(1-9个月为一位数,10-12个月为两位数)