微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法解析时间戳问题java.time.format.DateTimeParseException:无法在索引0处解析文本'9/25/2020,12:46:00 PM'

如何解决无法解析时间戳问题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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?