Java 尝试将 Json 响应转换为日期时出现 ParseException
Java ParseException when trying to convert Json response into date
目前正在尝试获取我的 Json 日期响应,以正确的日期格式显示。
下面是我的代码,后面是我得到的错误:
String expires = js.getString("expires["+i+"]");
SimpleDateFormat sdf = new SimpleDateFormat("dd MMMMM yyyy hha");
Date expiration = sdf.parse(expires);
System.out.println(expiration);
错误:
java.text.ParseException: Unparseable date: "2018-08-13T06:37:31Z"
at java.text.DateFormat.parse(DateFormat.java:366)
at fablemedia.demo.GoDaddyGET.Test(GoDaddyGET.java:78)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:583)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
at org.testng.TestRunner.privateRun(TestRunner.java:648)
at org.testng.TestRunner.run(TestRunner.java:505)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
at org.testng.SuiteRunner.run(SuiteRunner.java:364)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1137)
at org.testng.TestNG.runSuites(TestNG.java:1049)
at org.testng.TestNG.run(TestNG.java:1017)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)
我该如何解决这个问题?
谢谢
- 你为什么要使用充满糟糕设计和低效率的 SimpleDateFormatter。
我建议您使用新的 DateTime api。
public static void main(String[] args) throws ParseException {
String[] dateArray = new String[10]; // this can be a list as well (containing the date strings or null
for (String dateStr : dateArray) {
if (dateStr != null) {
LocalDateTime parse = LocalDateTime.parse(dateStr, DateTimeFormatter.ISO_DATE_TIME);
String format = parse.format(DateTimeFormatter.ofPattern("dd MMM yyyy hha"));
System.out.println(format);
}
}
}
您应该使用以下日期格式。
String expires = "2018-08-13T06:37:31Z";
SimpleDateFormat source = new SimpleDateFormat("YYYY-MM-DD'T'HH:mm:ss'Z'");
SimpleDateFormat target = new SimpleDateFormat("dd MMMMM yyyy hha");
Date expiration = source.parse(expires);
String finalDate = target.format(expiration);
System.out.println(finalDate);
the timezone is CEST btw
时区很重要。要输出所需时区的时间:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
"dd MMMM yyyy hha", Locale.ENGLISH);
String expires = "2018-08-13T06:37:31Z";
Instant inst = Instant.parse(expires);
System.out.println(inst.atZone(ZoneId.of("Europe/Warsaw")).format(formatter));
这会打印:
13 August 2018 08AM
我用Europe/Warsaw作为时区,请选择你自己喜欢的。许多时区在夏季都显示为 CEST,但它们并不完全相同。波兰和其他中欧国家在夏季比 UTC 早 2 小时,所以当我们解析的到期字符串表示 06:37
UTC 时,时间为 08AM
(尾部 Z
表示祖鲁时间区域或偏移量为零或只是 UTC)。
我指定 Locale.ENGLISH
因为 AM 和 PM 在英语以外的其他语言中几乎不使用,但同样,您应该自己选择。
要解析的字符串在某个时间点遵循 ISO 8601 格式,因此我将其解析为 Java Instant
,但未指定格式化程序。 java.time
的 类,现代 Java 日期和时间 API,将 ISO 8601 解析为默认值。
不要在 2018 年使用 Date
和 SimpleDateFormat
。那些 类 已经过时且设计不佳。特别是 SimpleDateFormat
是出了名的麻烦。 java.time
更好用。
链接
- Oracle tutorial: Date Time 解释如何使用
java.time
.
- Wikipedia article: ISO 8601
目前正在尝试获取我的 Json 日期响应,以正确的日期格式显示。 下面是我的代码,后面是我得到的错误:
String expires = js.getString("expires["+i+"]");
SimpleDateFormat sdf = new SimpleDateFormat("dd MMMMM yyyy hha");
Date expiration = sdf.parse(expires);
System.out.println(expiration);
错误:
java.text.ParseException: Unparseable date: "2018-08-13T06:37:31Z"
at java.text.DateFormat.parse(DateFormat.java:366)
at fablemedia.demo.GoDaddyGET.Test(GoDaddyGET.java:78)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:583)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
at org.testng.TestRunner.privateRun(TestRunner.java:648)
at org.testng.TestRunner.run(TestRunner.java:505)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
at org.testng.SuiteRunner.run(SuiteRunner.java:364)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1137)
at org.testng.TestNG.runSuites(TestNG.java:1049)
at org.testng.TestNG.run(TestNG.java:1017)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)
我该如何解决这个问题? 谢谢
- 你为什么要使用充满糟糕设计和低效率的 SimpleDateFormatter。
我建议您使用新的 DateTime api。
public static void main(String[] args) throws ParseException {
String[] dateArray = new String[10]; // this can be a list as well (containing the date strings or null
for (String dateStr : dateArray) {
if (dateStr != null) {
LocalDateTime parse = LocalDateTime.parse(dateStr, DateTimeFormatter.ISO_DATE_TIME);
String format = parse.format(DateTimeFormatter.ofPattern("dd MMM yyyy hha"));
System.out.println(format);
}
}
}
您应该使用以下日期格式。
String expires = "2018-08-13T06:37:31Z";
SimpleDateFormat source = new SimpleDateFormat("YYYY-MM-DD'T'HH:mm:ss'Z'");
SimpleDateFormat target = new SimpleDateFormat("dd MMMMM yyyy hha");
Date expiration = source.parse(expires);
String finalDate = target.format(expiration);
System.out.println(finalDate);
the timezone is CEST btw
时区很重要。要输出所需时区的时间:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
"dd MMMM yyyy hha", Locale.ENGLISH);
String expires = "2018-08-13T06:37:31Z";
Instant inst = Instant.parse(expires);
System.out.println(inst.atZone(ZoneId.of("Europe/Warsaw")).format(formatter));
这会打印:
13 August 2018 08AM
我用Europe/Warsaw作为时区,请选择你自己喜欢的。许多时区在夏季都显示为 CEST,但它们并不完全相同。波兰和其他中欧国家在夏季比 UTC 早 2 小时,所以当我们解析的到期字符串表示 06:37
UTC 时,时间为 08AM
(尾部 Z
表示祖鲁时间区域或偏移量为零或只是 UTC)。
我指定 Locale.ENGLISH
因为 AM 和 PM 在英语以外的其他语言中几乎不使用,但同样,您应该自己选择。
要解析的字符串在某个时间点遵循 ISO 8601 格式,因此我将其解析为 Java Instant
,但未指定格式化程序。 java.time
的 类,现代 Java 日期和时间 API,将 ISO 8601 解析为默认值。
不要在 2018 年使用 Date
和 SimpleDateFormat
。那些 类 已经过时且设计不佳。特别是 SimpleDateFormat
是出了名的麻烦。 java.time
更好用。
链接
- Oracle tutorial: Date Time 解释如何使用
java.time
. - Wikipedia article: ISO 8601