25

如何将此格式日期字符串2013-03-13T20:59:31+0000解析为 Date 对象?

我正在尝试这种方式,但它不起作用。

DateFormat df = new SimpleDateFormat("YYYY-MM-DDThh:mm:ssTZD");
Date result =  df.parse(time);
                    

我从第一行得到这个异常:

java.lang.IllegalArgumentException:非法模式字符'T'

4

7 回答 7

47

尝试:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");

检查http://developer.android.com/reference/java/text/SimpleDateFormat.html

具体来说:

                 yyyy-MM-dd 1969-12-31
                 yyyy-MM-dd 1970-01-01
           yyyy-MM-dd HH:mm 1969-12-31 16:00
           yyyy-MM-dd HH:mm 1970-01-01 00:00
          yyyy-MM-dd HH:mmZ 1969-12-31 16:00-0800
          yyyy-MM-dd HH:mmZ 1970-01-01 00:00+0000
   yyyy-MM-dd HH:mm:ss.SSSZ 1969-12-31 16:00:00.000-0800
   yyyy-MM-dd HH:mm:ss.SSSZ 1970-01-01 00:00:00.000+0000
 yyyy-MM-dd'T'HH:mm:ss.SSSZ 1969-12-31T16:00:00.000-0800
 yyyy-MM-dd'T'HH:mm:ss.SSSZ 1970-01-01T00:00:00.000+0000
于 2013-03-15T13:12:35.897 回答
44

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ssZ");

年份是小写的 y。输入中与日期无关的任何字符(如 'T'2013-03-13T20:59:31+0000应在''.

有关已定义模式字母的列表,请参阅文档

Parse 检查给定日期是否采用您指定的格式。要在检查后以特定格式打印日期,请参见下文:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ssZ");
Date result;
try {
    result = df.parse("2013-03-13T20:59:31+0000");
    System.out.println("date:"+result); //prints date in current locale
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
    System.out.println(sdf.format(result)); //prints date in the format sdf
}
于 2013-03-15T13:16:01.837 回答
5

java.time

java.util日期时间 API 及其格式化 API已SimpleDateFormat过时且容易出错。建议完全停止使用它们并切换到现代 Date-Time API *

使用java.time现代日期时间 API 的解决方案:您的输入字符串具有时区偏移,因此应将其解析为OffsetDateTime.

演示:

import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssxx", Locale.ENGLISH);
        OffsetDateTime odt = OffsetDateTime.parse("2013-03-13T20:59:31+0000", dtf);
        System.out.println(odt);
    }
}

输出:

2013-03-13T20:59:31Z

ONLINE DEMO

Z输出中的 是零时区偏移的时区指示符。它代表 Zulu 并指定Etc/UTC时区(时区偏移量为+00:00小时)。

从Trail: Date Time了解有关现代日期时间 API 的更多信息。检查此答案此答案以了解如何将java.timeAPI 与 JDBC 一起使用。

如果您需要java.util.Date

可以Date#from用来获取 的实例java.util.Date,如下图:

Date date = Date.from(odt.toInstant());

* 如果您正在为一个 Android 项目工作,并且您的 Android API 级别仍然不符合 Java-8,请通过 desugaring 检查可用的 Java 8+ API。请注意,Android 8.0 Oreo 已经提供java.time.

于 2021-10-25T21:54:15.807 回答
3

请试试这个:

SimpleDateFormat formatDate;
formatDate= new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
于 2013-03-15T13:13:07.403 回答
3

对于2017-02-08 06:23:35 +0000这种日期格式,我使用以下格式:

SimpleDateFormat formatDate;
formatDate= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ZZZ");

它为我工作。其他答案对我不起作用。

于 2017-02-08T12:05:01.093 回答
3

java.time

ZonedDateTime.parse("2020-05-08T11:12:13+0001", DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"))

我正在使用 java.time、现代 Java 日期和时间 API 及其ZonedDateTime类。AZonedDateTime是带有时区的日期和时间。如果要在 Android Oreo(API 级别 26)之前使用 java.time,则需要核心库 desugaring

T用单引号括起来,所以格式化程序知道它不是模式字母。问题中的T不带引号是您出现异常的原因,但格式模式字符串中也存在其他问题。yyyy-MM-dd'T'HH:mm:ssZ作品。

于 2021-02-19T19:29:36.760 回答
1

它也可以提供帮助

LocalDateTime dateTime = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"));
于 2021-10-22T08:59:38.580 回答