我需要在Java中将字符串解析为日期。我的字符串具有以下格式:
2014-09-17T12:00:44.0000000Z
当尝试解析这种格式时,Java会抛出以下异常:java.lang.IllegalArgumentException: Illegal pattern character 'T'
。 有什么好的方法来解析它吗?
谢谢!
我需要在Java中将字符串解析为日期。我的字符串具有以下格式:
2014-09-17T12:00:44.0000000Z
当尝试解析这种格式时,Java会抛出以下异常:java.lang.IllegalArgumentException: Illegal pattern character 'T'
。 有什么好的方法来解析它吗?
谢谢!
2014-09-17T12:00:44.0000000Z
,仅转义字母T
是不够的,还需要处理尾随的Z
。但是要注意,这个Z
并不是一个字面量,而是根据ISO-8601-standard
标准表示UTC+00:00
时区偏移量。因此,仅转义Z
是不正确的。
SimpleDateFormat
通过模式符号X
处理这个特殊字符Z
。因此,最终解决方案如下: SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSX");
Date d = sdf.parse("2014-09-17T12:00:44.0000000Z");
System.out.println(d); // output: Wed Sep 17 14:00:44 CEST 2014
CEST
(toString()
使用系统时区),结果等同于UTC时间12:00:44
。此外,我不得不插入七个符号S以便正确处理您的输入,这些输入伪装成精度达到100ns
(尽管Java 8之前只能处理毫秒)。
SimpleDateFormat
对象上设置时区为“GMT”。 - Meno HochschildSimpleDateFormat
-APIs 真的非常不同)。 - Meno Hochschild您需要转义'T'字符:
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
format.setTimeZone(TimeZone.getTimeZone("UTC"));
Date parse = format.parse("2014-09-17T12:00:44.0000000Z");
使用Answer来解答这个问题:这个日期格式是什么? 2011-08-12T20:17:46.384Z
现在是时候使用现代的Java日期和时间API - java.time 来处理日期和时间了。当这个问题被提出时,java.time已经随着Java 8发布了7个月。今天(2020年)没有人应该使用SimpleDateFormat
类,因为它已经过时并且容易出错。
使用java.time,我们不需要显式地指定格式化程序:
String str = "2014-09-17T12:00:44.0000000Z";
Instant i = Instant.parse(str);
System.out.println("As Instant: " + i);
输出结果为:
时间戳: 2014-09-17T12:00:44Z
您使用的是 ISO 8601 格式(底部链接),java.time 类通常将其作为默认格式解析 ISO 8601 并从其 toString
方法中返回 ISO 8601。在 ISO 8601 中,秒的小数部分是可选的。
如果您需要一个 Date
对象用于尚未升级到 java.time 的旧版 API:
Date oldfashionedDate = Date.from(i);
System.out.println("As old-fashioned Date: " + oldfashionedDate);
以我的时区为准的输出:
旧的Date时间: Wed Sep 17 14:00:44 CEST 2014
输出结果会因为使用 Date.toString()
方法导致受到时区影响而变化,因为该方法混淆了JVM的默认时区并将其用于渲染字符串。
虽然您没有向我们展示代码,但我们已经可以看出有几个问题:
SimpleDateFormat
无法正确解析带有7个小数位秒数的字符串。它仅支持毫秒,即恰好三个小数点。'T'
)来转义字面上的字符T
,否则SimpleDateFormat
会将其理解为格式模式字符而且实际上不存在T
格式模式字符。 这就是您的异常消息所指的。试一下这个。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateClass {
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
Date d = sdf.parse("2014-09-17T12:00:44.0000000Z");
System.out.println(d); //output Wed Sep 17 12:00:44 IST 2014
}
}