java.time
您不需要DateTimeFormatter来解析给定的日期-时间字符串。
Java SE 8日期时间API(Java。time API或现代的Date-Time API)基于ISO 8601,只要Date-Time字符串符合ISO 8601标准,就不需要显式使用DateTimeFormatter对象。
字符串中的Z是零时区偏移的时区指示符。它代表Zulu,并指定Etc/UTC时区(时区偏移量为+00:00小时)。
字符串中的T只是按照ISO-8601标准的日期-时间分隔符。
演示:
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
String strDateTime = "2011-08-12T20:17:46.384Z";
Instant instant = Instant.parse(strDateTime);
OffsetDateTime odt = OffsetDateTime.parse(strDateTime);
ZonedDateTime zdt = ZonedDateTime.parse(strDateTime);
System.out.println(instant);
System.out.println(odt);
System.out.println(zdt);
}
}
输出:
2011-08-12T20:17:46.384Z
2011-08-12T20:17:46.384Z
2011-08-12T20:17:46.384Z
了解更多关于java的知识。time,来自Trail: Date time的现代Date- time API*。
遗留的Date-time API
遗留的Date-time API (java。util Date-Time API和它们的格式化API SimpleDateFormat)已经过时并且容易出错。建议完全停止使用它们,并切换到现代的Date-Time API*。
为了完整起见,我编写了一个解决方案来使用遗留API解析这个Date-Time字符串。
不要在带有日期-时间解析/格式化API的模式中使用'Z'。
如上所述,Z(不带引号)是零时区偏移的时区指示符,而'Z'只是一个字符字面量,它没有任何意义。使用格式,y-M-d'T'H:m:s.SSSXXX。查看文档以了解更多关于这些符号的信息。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class Main {
public static void main(String[] args) throws ParseException {
String strDateTime = "2011-08-12T20:17:46.384Z";
SimpleDateFormat sdf = new SimpleDateFormat("y-M-d'T'H:m:s.SSSXXX", Locale.ENGLISH);
Date date = sdf.parse(strDateTime);
// ...
}
}
Note that a java.util.Date object is not a real Date-Time object like the modern Date-Time types; rather, it represents the number of milliseconds since the standard base time known as "the epoch", namely January 1, 1970, 00:00:00 GMT (or UTC). Since it does not hold any format and timezone information, it applies the format, EEE MMM dd HH:mm:ss z yyyy and the JVM's timezone to return the value of Date#toString derived from this milliseconds value. If you need to print the Date-Time in a different format and timezone, you will need to use a SimpleDateFormat with the desired format and the applicable timezone e.g.
sdf.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
String formatted = sdf.format(date);
System.out.println(formatted); // 2011-8-12T20:17:46.384Z
Joda Date-Time API
以下为约达时代官网公告:
注意,从Java SE 8开始,用户被要求迁移到Java。time (JSR-310)——JDK的核心部分,取代了这个项目。
同样,为了完整起见,我编写了一个解决方案来使用Joda Date-Time API解析这个Date-Time字符串。
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
String dateTimeStr = "2011-08-12T20:17:46.384Z";
DateTimeFormatter dtf = DateTimeFormat.forPattern("y-M-d'T'H:m:s.SSSZ").withOffsetParsed();
DateTime dateTime = dtf.parseDateTime(dateTimeStr);
System.out.println(dateTime);
}
}
输出:
2011-08-12T20:17:46.384Z
*无论出于何种原因,如果你必须坚持使用Java 6或Java 7,你可以使用ThreeTen-Backport,它可以向后移植大部分Java。Java 6和7的时间功能。如果你正在为一个Android项目工作,你的Android API级别仍然不兼容Java-8,检查Java 8+ API通过desugaring和如何使用ThreeTenABP在Android项目。