我尝试了以下方式,但没有成功。
DateFormat df = new SimpleDateFormat("YYYY-MM-DDThh:mm:ssTZD");
Date result = df.parse(time);
我从第一行得到了以下异常信息:
java.lang.IllegalArgumentException: 非法的模式字符'T'
DateFormat df = new SimpleDateFormat("YYYY-MM-DDThh:mm:ssTZD");
Date result = df.parse(time);
java.lang.IllegalArgumentException: 非法的模式字符'T'
尝试:
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
请查看 http://developer.android.com/reference/java/text/SimpleDateFormat.html
具体而言:
yyyy-MM-dd 1969-12-31
yyyy-MM-dd 1970-01-01
yyyy-MM-dd HH:mm 1969-12-31 16:00
yyyy-MM-dd HH:mm 1970-01-01 00:00
yyyy-MM-dd HH:mmZ 1969-12-31 16:00-0800
yyyy-MM-dd HH:mmZ 1970-01-01 00:00+0000
yyyy-MM-dd HH:mm:ss.SSSZ 1969-12-31 16:00:00.000-0800
yyyy-MM-dd HH:mm:ss.SSSZ 1970-01-01 00:00:00.000+0000
yyyy-MM-dd'T'HH:mm:ss.SSSZ 1969-12-31T16:00:00.000-0800
yyyy-MM-dd'T'HH:mm:ss.SSSZ 1970-01-01T00:00:00.000+0000
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ssZ");
年份用小写字母y。
输入中与日期无关的任何字符(例如2013-03-13T20:59:31+0000
中的“T”)应在''
中引用。
有关已定义的模式字母列表,请参见文档。
解析检查给定日期是否符合指定格式。要在检查后以特定格式打印日期,请参见下文:
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ssZ");
Date result;
try {
result = df.parse("2013-03-13T20:59:31+0000");
System.out.println("date:"+result); //prints date in current locale
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(sdf.format(result)); //prints date in the format sdf
}
''
引起来”。但是在你最初的例子中,Z
没有被“''
”包围,这样可以吗?我只是添加了 'Z'
,现在一切都正常了。 - MikeDateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH); LocalDateTime ldt = LocalDateTime.parse("2013-03-13T20:59:31+0000",formatter);
这段代码是正确的 - 将 Z 用 '' 包围会抛出异常。 - msamjava.util
日期时间API及其格式化APISimpleDateFormat
已过时且易出错。建议完全停止使用它们,改用现代日期时间API*。
使用java.time
现代日期时间API的解决方案:您的输入字符串带有时区偏移量,因此应将其解析为OffsetDateTime
。
演示:
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssxx", Locale.ENGLISH);
OffsetDateTime odt = OffsetDateTime.parse("2013-03-13T20:59:31+0000", dtf);
System.out.println(odt);
}
}
输出:
2013-03-13T20:59:31Z
输出中的Z
是零时区偏移的时区指示器。它代表了Zulu并指定了Etc/UTC
时区(该时区具有+00:00
小时的时差)。
从Trail: 日期时间中学习更多关于现代Date-Time API的内容。查看此回答和此回答,了解如何使用JDBC与java.time
API。
java.util.Date
:您可以使用Date#from
来获取java.util.Date
的实例,如下所示:
Date date = Date.from(odt.toInstant());
* 如果您正在从事Android项目,而您的Android API级别仍不符合Java-8,请查看透过解糖可用的Java 8+ API。请注意,Android 8.0 Oreo已经提供了对java.time
的支持。
对于这种日期格式2017-02-08 06:23:35 +0000,我使用以下格式:
SimpleDateFormat formatDate;
formatDate= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ZZZ");
我的情况下这个方法可行。其他答案对我没有用。
ZonedDateTime.parse("2020-05-08T11:12:13+0001", DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"))
ZonedDateTime
类。 ZonedDateTime
是带有时区的日期和时间。如果您要在Android Oreo(API级别26)之前使用java.time,则需要核心库去雕饰。T
,以便格式化程序知道它不是一个模式字母。问题中没有引号的T
是您遇到异常的原因,但格式模式字符串中还存在其他问题。yyyy-MM-dd'T'HH:mm:ssZ
可行。SimpleDateFormat formatDate;
formatDate= new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
它也可以帮助
LocalDateTime dateTime = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"));
DateFormat
、SimpleDateFormat
和Date
。这些类非常麻烦且过时。相反,使用来自java.time,现代Java日期和时间API的OffsetDateTime
和DateTimeFormatter
。请参见Arvind Kumar Avinash的好答案。 - Ole V.V.