我正在尝试将"Wed Jun 01 00:00:00 GMT-400 2016"格式的字符串转换为ISO8601 "2016-06-01T00:00:00.000Z"。我得到一个错误"无法解析的日期"。我不确定我做错了什么。
DateFormat startDate = new SimpleDateFormat("EEE MMM dd HH:mm:ss 'GMT'Z yyyy", Locale.US);
startDate.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'", Locale.US);
formatter.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
Date aParsedDate = null;
try {
// give the date in that format
aParsedDate = (Date) startDate.parse(inputDateAsString);
System.out.println(aParsedDate.toString());
// convert Date to ISO8601
String nowAsISO = formatter.format(aParsedDate);
System.out.println("ISO date = " + nowAsISO);
return nowAsISO;
} catch (ParseException e) {
e.printStackTrace();
}
java.time
时区偏移量的ISO 8601标准是用两位数字表示HOUR。HOUR和MINUTE的分隔符是可选的。MINUTE为零时也是可选的。但是,在日期-时间字符串Wed Jun 01 00:00:00 GMT-400 2016中,HOUR只有一个数字。
日期-时间字符串Wed Jun 01 00:00:00 GMT-400 2016所在的模式没有定义OOTB(现成的)DateTimeFormatter
。幸运的是,java.time
,现代日期时间API为您提供了一种使用复杂模式定义/构建解析/格式化类型的方法。
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
DateTimeFormatter dtf = new DateTimeFormatterBuilder()
.appendPattern("E MMM d H:m:s")
.appendLiteral(' ')
.appendZoneId()
.appendOffset("+Hmm", "")
.appendLiteral(' ')
.appendPattern("u")
.toFormatter(Locale.ENGLISH);
String strDateTime = "Wed Jun 01 00:00:00 GMT-400 2016";
OffsetDateTime odt = OffsetDateTime.parse(strDateTime, dtf);
System.out.println(odt);
}
}
输出:2016-06-01T00:00-04:00
如您所见,对于时区偏移量,我使用了模式+Hmm
(一位数表示HOUR,两位数表示MINUTE)。
从Trail: Date Time了解更多关于现代日期时间API的信息。
请注意,遗留的日期时间API (java.util
日期时间类型及其格式化类型SimpleDateFormat
)已经过时并且容易出错。建议完全停止使用它,并切换到java.time
,现代日期时间API*。
无论出于何种原因,如果您需要将OffsetDateTime
的对象转换为java.util.Date
的对象,您可以这样做:
Date date = Date.from(odt.toInstant());
*出于任何原因,如果你必须坚持Java 6或Java 7,你可以使用ThreeTen-Backport,它支持大部分 Java。time功能到Java 6 &7. 如果你正在为一个Android项目工作,你的Android API级别仍然不符合Java-8,检查Java 8+可用的API,通过desugaring和如何在Android项目中使用ThreeTenABP。