Java ParseException при попытке преобразовать ответ Json в дату - PullRequest
0 голосов
/ 17 мая 2018

В данный момент пытаюсь получить мой 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 голосов
/ 17 мая 2018

Вы должны использовать приведенный ниже формат даты.

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);
0 голосов
/ 18 мая 2018

часовой пояс 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));

Thisотпечатки:

13 августа 2018 г. 08:00

Я использовал Европу / Варшаву в качестве часового пояса, пожалуйста, выберите свой любимый.Многие часовые пояса отображаются как CEST летом, но они не идентичны.Польша и другие страны Центральной Европы летом на 2 часа опережают UTC, поэтому время дается как 08AM, когда строка истечения, которую мы проанализировали, сказала: 06:37 UTC (трейлинг Z означает часовой пояс Зулуса или смещение нуля или простоUTC).

Я указал Locale.ENGLISH, потому что AM и PM едва ли используются на других языках, кроме английского, но, опять же, вы должны сделать свой собственный выбор.

Строка, которую нужно проанализировать, придерживаетсяФормат ISO 8601 на определенный момент времени, поэтому я анализирую его в Java Instant без указания форматера.Классы java.time, современного Java-API даты и времени, анализируют ISO 8601 как значение по умолчанию.

Не используйте Date и SimpleDateFormat в 2018 году. Эти классы давно устарели и плохо разработаны,В частности, SimpleDateFormat имеет репутацию проблемного.java.time гораздо приятнее работать.

Ссылки

0 голосов
/ 17 мая 2018
  1. Почему вы используете SimpleDateFormatter, который полон плохого дизайна и неэффективности.

Я бы предложил вам использовать новый API DateTime.

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);
        }
    }
}
...