无法解析时间戳问题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,它是一位数字。您可以将单个字母用于月,日,年,时,分,秒等,以容纳所有允许的数字位数。另外,我建议您以不区分大小写的方式对其进行解析,以便可以同时使用大写和小写(例如AMam)。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...