遇到错误
java.text.ParseException: Unparseable date: "2018-09-09T09:04:47+00:00"
这是什么日期格式?
答案 0 :(得分:2)
关于这种日期格式似乎有些困惑,所以我会解释。
这是一个带时区偏移量的ISO 8601日期时间值。
参考文献:
Z
是ISO标准时区说明符。它的含义与+00.00
相同,并且在某些圈子(例如军队)中被称为“祖鲁时间”。
ISO 8601日期/时间不必“必须”以Z
结尾。还有其他形式的时区规范,实际上日期/时间根本不需要时区。
您不需要修剪Z
。 Java的数据时间解析器可以解析Z
时区说明符,并为其赋予正确的含义……如果您使用正确的模式。
如果ISO日期时间是“不可解析的”,则意味着您(显式或隐式)使用了错误的格式来解析它。
不幸的是,不同的国家(地区)具有不同的默认日期/时间格式,而且更糟糕的是,仍然没有可靠的方法(通常)来知道哪种才是正确的...如果您不这样做的话知道它来自哪里。
幸运的是... ISO 8601是国际标准。如果您看到符合ISO 8601语法的日期/时间,则说明其含义。
有很多ISO 8601日期和日期/时间表示形式,如W3联盟TR中所述。可以毫无区别地区分出不同种类。
如果使用java.text.SimpleDateFormat
进行解析,则此ISO 8601版本的正确格式为"yyyy-MM-dd'T'HH:mm:ssX"
。 java.time.format.DateTimeFormatter
可用的模式也是"yyyy-MM-dd'T'HH:mm:ssX"
DateTimeFormatter
类还定义了许多标准格式为常量。此类ISO 8601日期/时间的格式为DateTimeFormatter.ISO_OFFSET_DATE_TIME
。其他种类也被定义。
Date
和Calendar
类以及关联的类是 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;