我正在尝试转换字符串格式为" 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();
}
答案 0 :(得分:2)
时区偏移的 ISO 8601 标准是用两位数字表示 HOUR。 HOUR 和 MINUTE 的分隔符是可选的。 MINUTE 为零时也是可选的。但是,在您的日期时间字符串中,Wed Jun 01 00:00:00 GMT-400 2016,HOUR 只有一位数。
没有为日期时间字符串的模式定义 OOTB(开箱即用)DateTimeFormatter
,Wed Jun 01 00:00:00 GMT-400 2016 em> 是。幸运的是,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
,modern date-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+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。