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

尝试将Json响应转换为日期时发生Java ParseException,java,json,date,date-format,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(expi

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

  • 为什么要使用SimpleDataFormatter,它充满了糟糕的设计和低效
  • 我建议您使用新的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);
    
    时区是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日上午8时

    我使用欧洲/华沙作为时区,请选择您自己喜欢的时区。许多时区在夏季渲染为CEST,但它们并不相同。波兰和其他中欧国家在夏季比UTC提前2小时,因此当我们解析的过期字符串表示为UTC时,给出的时间为
    08AM
    (后面的
    Z
    表示祖鲁时区或偏移量为零或仅为UTC)

    我指定了
    Locale.ENGLISH
    ,因为AM和PM在英语以外的其他语言中几乎不使用,但同样,您应该自己选择

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

    2018年不要使用
    Date
    SimpleDateFormat
    。这些课程早已过时,设计也很糟糕。尤其是
    SimpleDateFormat
    以麻烦著称<代码>java.time更适合使用

    链接
    • 解释如何使用
      java.time

    尝试执行此操作时,它会将日期打印为“Sun Dec 31 06:37:31 CET 2017”。这是错误的。也许我还应该提到,这是在foreach循环中的,它迭代数组的大小,从中获取信息。此外,它所经历的一些值甚至没有“expires”值,这导致在“Date expirement=sdf.parse(expires);”行中出现一个NullPointerException(java.lang.NullPointerException),首先必须将字符串转换为日期,然后将日期转换为所需的格式。您跳过了第一步,这就是您获得异常的原因。在过期时添加空检查以避免NPE。我更新了我的答案。源代码的模式完全错误,请参阅符号Y(而不是Y)、D(而不是D)和Z(不应转义)的用法。
    yyy-MM-DD'T'HH:MM:ss'Z'
    非常错误。你需要注意那些字母的大小写。虽然
    T
    是一个文本,是格式的一部分,
    Z
    是一个偏移量,应该这样解析,否则你会得到错误的结果。你试过我的答案吗?它的工作原理与预期一样,而且非常干净。我建议您避免使用
    SimpleDateFormat
    类。它不仅早已过时,而且还出了名的麻烦。今天我们有了更好的表现。你期望/期望的结果是什么?@OleV.V。其实我所需要的只是日期和年份,时间其实并不太必要,但肯定不会伤害到包括它,对不起,我不清楚。我是说,时间在哪个时区?这有很大的不同。日期也不尽相同:在所有时区,日期都不是同一天。请在请求调试帮助时了解这一点。始终尽可能精确地包含程序所需的行为。Thx为此,我可能忘记告诉您,我是在foreach循环*数组大小中执行此操作的,并且并非数组的所有元素都包含此“expires”值,这会导致以下错误:“java.lang.NullPointerException:text”,在线:“LocalDateTime parse=LocalDateTime.parse(expires,DateTimeFormatter.ISO_DATE_TIME);”。但是对于那些包含“expires”值的,它是有效的,所以thx用于这个。如果它有效的话!我建议你接受这个答案。