找不到此日期的格式:“ 2018-09-09T09:04:47 + 00:00”

时间:2018-09-09 11:14:48

标签: date

遇到错误

java.text.ParseException: Unparseable date: "2018-09-09T09:04:47+00:00"

这是什么日期格式?

3 个答案:

答案 0 :(得分:2)

关于这种日期格式似乎有些困惑,所以我会解释。

  1. 这是一个带时区偏移量的ISO 8601日期时间值。

    参考文献:

    • Wikipedia中的ISO 8601页是准确且非常全面的。
    • W3联盟已在TR中记录了文件; here
    • 正式版本可从ISO获得; here
  2. Z是ISO标准时区说明符。它的含义与+00.00相同,并且在某些圈子(例如军队)中被称为“祖鲁时间”。

  3. ISO 8601日期/时间不必“必须”以Z结尾。还有其他形式的时区规范,实际上日期/时间根本不需要时区。

  4. 您不需要修剪Z。 Java的数据时间解析器可以解析Z时区说明符,并为其赋予正确的含义……如果您使用正确的模式。

  5. 如果ISO日期时间是“不可解析的”,则意味着您(显式或隐式)使用了错误的格式来解析它。

  6. 不幸的是,不同的国家(地区)具有不同的默认日期/时间格式,而且更糟糕的是,仍然没有可靠的方法(通常)来知道哪种才是正确的...如果您不这样做的话知道它来自哪里。

  7. 幸运的是... ISO 8601是国际标准。如果您看到符合ISO 8601语法的日期/时间,则说明其含义。

  8. 有很多ISO 8601日期和日期/时间表示形式,如W3联盟TR中所述。可以毫无区别地区分出不同种类。

  9. 如果使用java.text.SimpleDateFormat进行解析,则此ISO 8601版本的正确格式为"yyyy-MM-dd'T'HH:mm:ssX"java.time.format.DateTimeFormatter可用的模式也是"yyyy-MM-dd'T'HH:mm:ssX"

  10. DateTimeFormatter类还定义了许多标准格式为常量。此类ISO 8601日期/时间的格式为DateTimeFormatter.ISO_OFFSET_DATE_TIME。其他种类也被定义。

  11. DateCalendar类以及关联的类是 legacy 类。建议在新代码中使用新的java.time类。

答案 1 :(得分:1)

使用此转换方法转换为String to date的{​​{1}}。但是通常,ISO格式以ISO format结尾,但不是没有问题。此方法返回Date,然后根据此返回值执行所需的操作。

Z

public static Date toCalendar( String isoDate) throws ParseException { String s = isoDate.replace("Z", "+00:00"); try { s = s.substring(0, 22) + s.substring(23); // to get rid of the ":" } catch (IndexOutOfBoundsException e) { throw new ParseException("Invalid length", 0); } return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(s); } 或更高版本中有此用法,请尝试;

Java8 TimeApi

或仅使用此模式OffsetDateTime offsetDateTime = OffsetDateTime.parse( "2018-09-09T09:04:47+01:00" ); Instant instant = offsetDateTime.toInstant(); java.util.Date date = java.util.Date.from( instant );

答案 2 :(得分:1)

您应使用“ X”作为时区:

select sender_id,receiver_id,message, count(*) 
  from chat 
  where (`sender_id` = '5' OR `receiver_id` = '5') 
  group by receiver_id, sender_id 
  HAVING count(*) > 1;