【问题标题】:java SimpleDateFormatjava SimpleDateFormat
【发布时间】:2011-09-18 09:16:45
【问题描述】:

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

“2007-11-02T14:46:03+01:00” 字符串日期="2007-11-02T14:46:03+01:00"; 字符串格式 = "yyyy-MM-ddTHH:mm:ssz"; 新的 SimpleDateFormat(format).parse(date); 线程“主”java.lang.IllegalArgumentException 中的异常:非法模式字符“T” 在 java.text.SimpleDateFormat.compile(SimpleDateFormat.java:769) 在 java.text.SimpleDateFormat.initialize(SimpleDateFormat.java:576) 在 java.text.SimpleDateFormat.(SimpleDateFormat.java:501) 在 java.text.SimpleDateFormat.(SimpleDateFormat.java:476)

【问题讨论】:

  • 请注意,关于解析 ISO 8601 日期的问题是一个常见问题解答。搜索“Java ISO 8601 日期”或类似内容,您会找到很多答案。
  • 对于今天或明天阅读此问题的任何人,我建议您不要使用SimpleDateFormat。这个类是出了名的麻烦而且已经过时了。相反,只需使用来自java.time, the modern Java date and time APIOffsetDateTime

标签: java date


【解决方案1】:

无需格式化程序

现在是发布现代答案的时候了,该答案使用 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);

结果和之前一样。

链接

Oracle tutorial: Date Time 解释如何使用 java.time。

【讨论】:

    【解决方案2】:

    如果你不关心时区,你可以使用这种方法。

      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;
      }
    

    我不知道它是否对你还有用,但是我现在遇到了同样的问题,后来我想出了这个。

    【讨论】:

    • 您需要注意 UTC 偏移量,否则您会得到不正确的结果(通常情况下)。
    【解决方案3】:

    您尝试解析的时间似乎在ISO 8601 formatSimpleDateFormat 不幸的是不支持与 ISO 8601 相同的时区说明符。如果您希望能够正确处理 ISO 中指定的所有形式,最好的办法是使用 Joda time

    这个例子直接来自user guide

    DateTime dt = new DateTime("2004-12-13T21:39:45.618-08:00");
    

    【讨论】:

    • 这不起作用,+01:00 必须是 +0100 才能让 joda 工作。
    • @user - 你是对的,ISO 版本不喜欢冒号。好消息是您可以将带有冒号的版本直接传递给 DateTime 构造函数。
    【解决方案4】:
    String testDate = "2007-11-02T14:46:03+01:00";
    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");
    Date date = formatter.parse(testDate);
    System.out.println(date);
    

    你可以尝试类似上面的方法

    您可以使用以下link作为参考

    【讨论】:

      【解决方案5】:

      你可以试试

      String format = "yyyy-MM-dd'T'HH:mm:ssz";
      

      参考:来自Javadoc

      文本可以用单引号引起来 (') 以避免解释。

      【讨论】:

      • 仅当字符串包含“GMT”时才有效。就像这样:字符串日期="2007-11-02T14:46:03GMT+01:00";
      • @Hendra 是真的或者它必须是 String date ="2007-11-02T14:46:03+0100"; SimpleDateTime 在这种情况下非常有限,我猜如果你(OP)对输入没有太多控制,使用像 joda time 这样的库效果最好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      • 2013-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多