尝试将Json响应转换为日期时的Java ParseException

时间:2018-05-17 15:00:00

标签: java json date date-format

目前正在尝试获取日期的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)

我该如何解决这个问题? THX。

3 个答案:

答案 0 :(得分:2)

  1. 为什么使用SimpleDateFormatter,它充满了糟糕的设计和低效率。
  2. 我建议你使用新的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);
            }
        }
    }
    

答案 1 :(得分:1)

  

时区是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));

打印:

  

2018年8月13日08 AM

我使用欧洲/华沙作为时区,请选择自己喜欢的。许多时区在夏季呈现为CEST,但它们并不相同。波兰和其他中欧国家在夏季比UTC早2小时,所以当我们解析的过期字符串08AM UTC时,时间为06:37(尾随Z表示祖鲁时间区域或偏移零或仅UTC)。

我指定了Locale.ENGLISH,因为AM和PM几乎不会用于其他语言而不是英语,但同样,你应该自己选择。

要解析的字符串在某个时间点符合ISO 8601格式,因此我将其解析为Java Instant而未指定格式化程序。 java.time的类(现代Java日期和时间API)将ISO 8601解析为默认值。

2018年不要使用DateSimpleDateFormat。这些课程已经过时且设计不佳。特别是SimpleDateFormat因为麻烦而闻名。 java.time可以更好地使用。

链接

答案 2 :(得分:0)

您应该使用以下日期格式。

np.append(result_array, inter2d_result)