dateformat parseexception for 2020-12-16t16:27:57+00:00

ohfgkhjo  于 2021-06-29  发布在  Java
关注(0)|答案(3)|浏览(339)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss`ZZ:ZZ`");
        sdf.parse("2020-12-16T16:27:57+00:00");

我不确定日期是什么,但我很肯定是yyyy mm dd't'hh:mm:ss ZZ:ZZ 或者类似的。我在猜z是从哪里来的https://help.sumologic.com/03send-data/sources/04reference-information-for-sources/timestamps%2c-time-zones%2c-time-ranges%2c-and-date-formats
正确的格式是什么?如何将其转换为ms?
我也试过了

Instant instant = Instant.parse("2020-12-16T16:27:57+00:00");

我从minecraft的json文件中获取它。我拒绝使用joda时间,因为minecraft最初是用java5编写的,没有使用joda时间。他们后来更新到Java7

cvxl0en2

cvxl0en21#

我想出来了


* parse them zula times. example: 2010-09-18T21:35:15.000Z

     */
    public static long parseZTime(String strTime) 
    {
        return Instant.parse(strTime).toEpochMilli();
    }

    /**
     * parse the offset times. example: 2015-11-10T16:43:29-0500 and 2014-05-14T17:29:23+00:00
     */
    public static long parseOffsetTime(String strTime)
    {
        return OffsetDateTime.parse(strTime).toInstant().toEpochMilli();
    }
vwoqyblh

vwoqyblh2#

java.time文件

api的日期时间 java.util 以及它们的格式化api, SimpleDateFormat 过时且容易出错。建议完全停止使用它们,并切换到现代日期时间api。
出于任何原因,如果您必须坚持使用Java6或Java7,您可以使用threeten backport,它将大部分java.time功能向后移植到Java6和Java7。
如果您正在为一个android项目工作,并且您的android api级别仍然不符合java-8,请检查通过desugaring提供的java8+api以及如何在android项目中使用threetenabp。
使用现代日期时间api:
由于日期时间字符串符合iso-8601格式,因此可以直接解析它(即不使用 DateTimeFormatter )至 OffsetDateTime .

import java.time.OffsetDateTime;
import java.util.concurrent.TimeUnit;

public class Main {
    public static void main(String[] args) {
        String strDateTime = "2020-12-16T16:27:57+00:00";
        OffsetDateTime odt = OffsetDateTime.parse(strDateTime);
        System.out.println(odt);
        System.out.println("No of milliseconds from Epoch: " + odt.toInstant().toEpochMilli());
        // Alternatively
        System.out.println("No of milliseconds from Epoch: " + TimeUnit.SECONDS.toMillis(odt.toEpochSecond()));
    }
}

输出:

2020-12-16T16:27:57Z
No of milliseconds from Epoch: 1608136077000
No of milliseconds from Epoch: 1608136077000

你的答案怎么了?

使用 ZZ:ZZ 而不是一个 X :查看文档以了解更多信息。另外,我不确定你们是否已附上 ZZ:ZZ 在引号中,用于格式化代码,只是为了突出显示它作为一个代码,或者您已经在实际代码中这样做了。千万不要把 Z 单引号内;否则,就意味着 Z 作为字符文本而不是时区。检查这个答案以便更好地理解它。
虽然这不是强制的解析,但您永远不应该使用 SimpleDateFormat 或者 DateTimeFormatter 没有一个 Locale . 检查这个答案以便更好地理解它。
使用旧api:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.util.Date;
import java.util.Locale;

public class Main {
    public static void main(String[] args) throws ParseException {
        String strDateTime = "2020-12-16T16:27:57+00:00";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX", Locale.ENGLISH);
        Date date = sdf.parse(strDateTime);
        System.out.println(date);
        System.out.println("No of milliseconds from Epoch: " + date.getTime());

        // Given below is how you can convert the legacy type, java.util.Date to the
        // modern type java.time.Instant
        Instant instant = date.toInstant();
        System.out.println("No of milliseconds from Epoch: " + instant.toEpochMilli());
    }
}

输出:

Wed Dec 16 16:27:57 GMT 2020
No of milliseconds from Epoch: 1608136077000
No of milliseconds from Epoch: 1608136077000

请注意 java.util.Date 对象不是像现代日期时间类型那样的实时日期时间对象;相反,它表示自称为“epoch”的标准基准时间以来的毫秒数,即 January 1, 1970, 00:00:00 GMT (或utc)。打印对象时 java.util.Date ,其 toString 方法返回jvm时区中的日期时间,该值是从该毫秒值计算出来的。如果需要在不同的时区打印日期时间,则需要将时区设置为 SimpleDateFormat 并从中获取格式化字符串。

nwwlzxa7

nwwlzxa73#

OffsetDateTime.parse( "2020-12-16T16:27:57+00:00" )

从不使用 SimpleDateFormat 或者其他几年前被现代java.time类取代的糟糕的日期时间类。
在解析/生成表示日期时间值的字符串时,java.time类默认使用标准iso8601格式。您的输入是这些标准格式之一。所以不需要指定格式化模式。

关于java.time

java.time框架内置于Java8及更高版本中。这些类取代了旧的遗留日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .
要了解更多信息,请参阅oracle教程。和搜索堆栈溢出的许多例子和解释。规格为jsr 310。
现在处于维护模式的joda time项目建议迁移到java.time类。
您可以直接与数据库交换java.time对象。使用符合jdbc 4.2或更高版本的jdbc驱动程序。不需要线,不需要线 java.sql.* 班级。hibernate5和jpa2.2支持java.time。
从哪里获得java.time类?
JavaSE8、JavaSE9、JavaSE10、JavaSE11及更高版本—标准JavaAPI的一部分,带有捆绑实现。
Java9带来了一些小的特性和修复。
java se 6和java se 7
大部分java.time功能都是通过三个十个后端口后端口移植到Java6和Java7的。
安卓
android(26+)的更高版本捆绑了java.time类的实现。
对于早期的android(<26),一个称为api desugaring的过程带来了java.time功能的一个子集,这些功能最初没有内置到android中。
如果desugaring不能提供您所需要的,那么threetenabp项目将threeten backport(如上所述)改编为android。了解如何使用threetenabp…。

相关问题