java SimpleDataFormat

java SimpleDataFormat,java,date,Java,Date,在Java中,如何解析包含不表示模式的字母的日期字符串 "2007-11-02T14:46:03+01:00" “2007-11-02T14:46:03+01:00” 字符串日期=“2007-11-02T14:46:03+01:00”; 字符串格式=“yyyy-MM-ddTHH:MM:ssz”; 新的SimpleDataFormat(格式).parse(日期); 线程“main”java.lang.IllegalArgumentException中出现异常:非法模式字符“T” 位于java.te

在Java中,如何解析包含不表示模式的字母的日期字符串

"2007-11-02T14:46:03+01:00" “2007-11-02T14:46:03+01:00” 字符串日期=“2007-11-02T14:46:03+01:00”; 字符串格式=“yyyy-MM-ddTHH:MM:ssz”; 新的SimpleDataFormat(格式).parse(日期); 线程“main”java.lang.IllegalArgumentException中出现异常:非法模式字符“T” 位于java.text.simpleDataFormat.compile(simpleDataFormat.java:769) 在java.text.simpleDataFormat.initialize(simpleDataFormat.java:576) 位于java.text.simpleDataFormat。(simpleDataFormat.java:501) 位于java.text.simpleDataFormat。(simpleDataFormat.java:476) 你可以试试

String format = "yyyy-MM-dd'T'HH:mm:ssz";
参考:来自

文本可以使用单引号引用 (')以避免解释

您可以尝试与上面类似的方法


您可以在尝试解析时使用以下内容作为参考<代码>SimpleDataFormat很遗憾,它不支持与ISO 8601相同的所有时区说明符。如果您希望能够正确处理ISO中指定的所有表单,那么最好使用

此示例直接来自以下内容:


如果你不在乎时区,你可以使用这个方法

  public static Date convertToDate(String strDate) throws ParseException {
    Date date = null;
    if (strDate != null) {
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
      date = sdf.parse(strDate);
    }
    return date;
  }
我不知道它是否对您仍然有用,但我现在遇到了相同的问题,经过一段时间后,我提出了这个问题。

不需要格式化程序 现在是发布现代答案的时候了,这个答案使用了java.time,现代java日期和时间API。您的格式是ISO 8601,java.time类通常将最常见的ISO 8601变体解析为默认格式,也就是说,没有任何显式格式设置程序

    String date ="2007-11-02T14:46:03+01:00";
    OffsetDateTime dateTime = OffsetDateTime.parse(date);
    System.out.println(dateTime);
输出为:

2007-11-02T14:46:03+01:00

是的,java.time还从
toString
方法返回ISO 8601格式,在打印对象时隐式调用

用单引号将文字字母括起来 要回答问题,您可以用单引号将字母括起来,使
DateTimeFormatter
将它们作为文字字母而不是格式说明符。在实际代码中执行以下操作毫无意义,但为了演示:

    DateTimeFormatter isoFormatter
            = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX");
    String date ="2007-11-02T14:46:03+01:00";
    OffsetDateTime dateTime = OffsetDateTime.parse(date, isoFormatter);
结果和以前一样

链接
解释如何使用java.time。

它仅在字符串包含“GMT”时有效。就像这样:String date=“2007-11-02T14:46:03GMT+01:00”@这是真的,或者必须是
String date=“2007-11-02T14:46:03+0100”
SimpleDateTime
在这种情况下是非常有限的,我想如果您(OP)对输入没有太多控制权,使用诸如joda time之类的库会效果最好。这不起作用,+01:00必须是+0100才能使joda起作用。@用户-您是对的,ISO版本不喜欢冒号。好消息是,您可以将带有冒号的版本直接传递给
DateTime
构造函数。请注意,有关解析ISO 8601日期的问题是一个常见问题和答案。搜索“Java ISO 8601 date”或类似内容,您将找到许多答案。例如:对于今天或明天阅读此问题的任何人,我建议您不要使用
SimpleDataFormat
。那门课是出了名的麻烦和过时。相反,只需使用
OffsetDateTime
from。您需要注意UTC偏移量,否则会得到错误的结果(通常情况下)。
  public static Date convertToDate(String strDate) throws ParseException {
    Date date = null;
    if (strDate != null) {
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
      date = sdf.parse(strDate);
    }
    return date;
  }
    String date ="2007-11-02T14:46:03+01:00";
    OffsetDateTime dateTime = OffsetDateTime.parse(date);
    System.out.println(dateTime);
    DateTimeFormatter isoFormatter
            = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX");
    String date ="2007-11-02T14:46:03+01:00";
    OffsetDateTime dateTime = OffsetDateTime.parse(date, isoFormatter);