我正在尝试将ISO 8601格式的字符串转换为java.util.Date。
我发现模式yyyy-MM-dd'T'HH:mm:ssZ是符合iso8601的,如果使用区域设置(比较样本)。
然而,使用java.text。SimpleDateFormat,我无法转换正确格式化的字符串2010-01-01T12:00:00+01:00。我必须首先将其转换为2010-01-01T12:00:00+0100,不带冒号。
目前的解决方案是
SimpleDateFormat ISO8601DATEFORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.GERMANY);
String date = "2010-01-01T12:00:00+01:00".replaceAll("\\+0([0-9]){1}\\:00", "+0$100");
System.out.println(ISO8601DATEFORMAT.parse(date));
这显然不太好。是我错过了什么,还是有更好的解决方案?
回答
感谢JuanZe的评论,我发现了Joda-Time魔法,这里也有描述。
所以解是
DateTimeFormatter parser2 = ISODateTimeFormat.dateTimeNoMillis();
String jtdate = "2010-01-01T12:00:00+01:00";
System.out.println(parser2.parseDateTime(jtdate));
或者更简单地说,通过构造函数使用默认解析器:
DateTime dt = new DateTime( "2010-01-01T12:00:00+01:00" ) ;
对我来说,这很好。
我不能使用Java 8的特性,所以只有Java .util. date可用。我已经依赖于gson库,但不想直接使用ISO8601Utils。ISO8601Utils是一个内部API, gson的作者警告不要使用它。
我用gson的公共API解析了一个ISO8601日期:
fun parseISO8601DateToLocalTimeOrNull(date: String): Date? {
return try {
GsonBuilder()
.create()
.getAdapter(Date::class.java)
.fromJson("\"$date\"")
} catch (t: Throwable) {
null
}
}
实际上,适配器仍然使用ISO8601Utils。但是如果您正在使用适配器,您可以确保不同的兼容版本的gson不会破坏您的项目。
我担心适配器的创建可能会很慢,所以我用debuggable=false在Pixel 3a上测量执行时间。parseISO8601DateToLocalTimeOrNull需要大约0.5毫秒来解析一个日期。
我遇到了同样的问题,并通过以下代码解决了它。
public static Calendar getCalendarFromISO(String datestring) {
Calendar calendar = Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault()) ;
SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.getDefault());
try {
Date date = dateformat.parse(datestring);
date.setHours(date.getHours() - 1);
calendar.setTime(date);
String test = dateformat.format(calendar.getTime());
Log.e("TEST_TIME", test);
} catch (ParseException e) {
e.printStackTrace();
}
return calendar;
}
之前我用过
SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss。SSSZ”,Locale.getDefault ());
但是后来我发现这个异常的主要原因是yyyy-MM-dd'T'HH:mm:ss。SSSZ,
所以我用了
-不知道SSS 'Z’,”场所。getDefault ();
这对我来说很有效。