解析字符串到目前为止:非法模式字符'T'。

时间:2014-10-16 07:34:00

标签: java string date simpledateformat

我需要在java中解析一个字符串。我的字符串格式如下:

2014-09-17T12:00:44.0000000Z

但是在尝试解析这种格式时,java会抛出以下异常... java.lang.IllegalArgumentException: Illegal pattern character 'T'

关于如何解析它的任何想法?

谢谢!

4 个答案:

答案 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

请注意,不同的时钟时间适用于时区CESTtoString()使用系统时区),结果等同于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");

使用答案:What is this date format? 2011-08-12T20:17:46.384Z

答案 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.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的默认时区并将其用于呈现字符串。

您怎么了?

您还没有向我们展示您的代码,但是我们已经可以断定有些错误:

  1. SimpleDateFormat无法正确解析秒中包含7个小数位的字符串。它仅支持毫秒,正好为三个小数。
  2. 在格式模式字符串中,您需要通过将单引号T'T'括在单引号中来对文字SimpleDateFormat进行转义,以将其理解为模式字母,并且没有格式模式字母T。这就是您的异常消息的意思。

链接