我需要在java中解析一个字符串。我的字符串格式如下:
2014-09-17T12:00:44.0000000Z
但是在尝试解析这种格式时,java会抛出以下异常... java.lang.IllegalArgumentException: Illegal pattern character 'T'
。
关于如何解析它的任何想法?
谢谢!
答案 0 :(得分:23)
鉴于您输入2014-09-17T12:00:44.0000000Z
,仅仅逃避字母T
是不够的。您还必须处理尾随Z
。但请注意,此Z
不是文字,但根据UTC+00:00
具有ISO-8601-standard
时区偏移的含义。所以逃避Z
是不正确的。
SimpleDateFormat
按模式符号Z
处理此特殊字符X
。所以最终的解决方案如下:
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-time 12:00:44
。此外,我必须插入七个符号S才能正确处理您的输入,假装精度降至100ns
(尽管Java pre 8只能处理毫秒)。
答案 1 :(得分:12)
你必须逃避' 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");
答案 2 :(得分:1)
试试这个。
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
}
}
答案 3 :(得分:0)
现在是时候给出现代答案了:始终使用Java.time(现代Java日期和时间API)进行日期和时间工作。当问到这个问题时,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中,秒的分数是可选的。
如果对于尚未升级到java.time的旧版API需要Date
对象:
Date oldfashionedDate = Date.from(i);
System.out.println("As old-fashioned Date: " + oldfashionedDate);
我所在时区的输出:
过时的日期:2014年9月17日星期三14:00:44 CEST
输出会随时区变化,因为Date.toString()
令人困惑地采用了JVM的默认时区并将其用于呈现字符串。
您还没有向我们展示您的代码,但是我们已经可以断定有些错误:
SimpleDateFormat
无法正确解析秒中包含7个小数位的字符串。它仅支持毫秒,正好为三个小数。T
或'T'
括在单引号中来对文字SimpleDateFormat
进行转义,以将其理解为模式字母,并且没有格式模式字母T
。这就是您的异常消息的意思。