java .text.ParseException: Непарсируемая дата: «Ср. 11 марта 2020» - PullRequest
0 голосов
/ 12 марта 2020

Полная дата, полученная из запроса, имеет следующий формат:

Wed Mar 11 2020 05:29:01 GMT+0100 (West Africa Standard Time)

Теперь я подсоединил ее к этому - ср. 11 марта 2020

date.substring(0,15))

Чтобы я мог сохранить дату , Я анализирую это, как показано ниже

SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-dd", Locale.ENGLISH);
Date parsedDate = null;
try {
    parsedDate = format.parse(date);
} catch (ParseException e) {
    e.printStackTrace();
}

Когда код запускается, я получаю ниже ошибки

java.text.ParseException: Unparseable date: "Wed Mar 11 2020"

Я также попытался синтаксический анализ с

SimpleDateFormat format = new SimpleDateFormat("EE MMM dd HH:mm:ss z yyyy",
                Locale.ENGLISH);

основанный на SO ответах, и я все еще получаю ошибку разбора даты.

Как я могу разобрать эту дату - date.substring (0,15))

Ответы [ 4 ]

1 голос
/ 12 марта 2020

Три пункта:

  1. Используйте java .time, современный Java API даты и времени, для своей работы с датой и временем.
  2. Вместо того, чтобы брать подстрока полученной строки, я бы предпочел проанализировать всю строку.
  3. Ваша строка шаблона формата должна соответствовать строке, которую вы пытаетесь проанализировать (и наоборот). Точно.

В коде:

DateTimeFormatter formatter = 
        DateTimeFormatter.ofPattern(
            "EEE MMM d uuuu HH:mm:ss 'GMT'xx (zzzz)",  // Pattern to match your input strings.
            Locale.UK                                  // Locale determines human language used to parse name of month and such.
        )
;
String dateString = "Wed Mar 11 2020 05:29:01 GMT+0100 (West Africa Standard Time)";
ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateString, formatter);

Создать строку.

System.out.println( zonedDateTime.toString() );

Вывод этого фрагмента:

2020-03-11T03: 29: 01 + 01: 00 [Африка / Лагос]

Использование java .time. С современным API работать гораздо приятнее. Класс Date, который вы использовали, плохо спроектирован, и SimpleDateFormat общеизвестно хлопотно. Не используйте ни один из них.

Разбор всей строки. Взятие подстроки длиной 15 заставит некоторых читателей вашего кода задуматься, некоторые спросят «WTF?», Некоторые - используйте свое драгоценное время для подсчета, чтобы убедиться, что 15 правильная длина. Также взять подстроку длиной 15 fr agile, если только вы не уверены, что сокращения дня недели и месяца всегда имеют длину три, а день месяца всегда пишется с двумя цифрами (02 мая, а не 2 мая). Более того, проще разобрать больше, чем вам нужно, и выбросить информацию позже, чем разобрать только то, что вам нужно, а потом обнаружить, что вам нужен еще один бит.

Указание формата. Поскольку ваша строка начинается с сокращения дня недели, вам нужна строка шаблона формата, которая начинается с буквы шаблона формата для дня недели. В этом случае EEE (или E или EE) для аббревиатуры (EEEE означало бы день, написанный полностью, как Wednesday ). Так что YYYY-MM-dd все не так. EE MMM dd HH:mm:ss z yyyy подходит ближе и может анализировать день недели, месяц и день месяца. Затем вводится пробел и год, но вместо этого строка шаблона формата имеет yyyy для года в конце, так что это то место, где для вас разрыв разбора. Если запись правильной строки шаблона формата дразнит (как это происходит для многих), уловка состоит в том, чтобы попробовать что-то и сначала использовать форматтер для форматирования даты и времени. Если результат отличается от строки, которую мы хотели бы проанализировать, она обычно дает нам подсказку о том, что не так.

Ссылка: Oracle учебник: Дата Время объясняя, как использовать java .time.

1 голос
/ 12 марта 2020

Формат , который вам нужен, чтобы соответствовать вашей дате: EEE MMM dd yyyy Например,

String date = "Wed Mar 11 2020 05:29:01 GMT+0100 (West Africa Standard Time)";
date = date.substring(0,15);
SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd yyyy");
Date parsedDate = null;
try {
    parsedDate = format.parse(date);
} catch (Exception e) {
    e.printStackTrace();
}     
System.out.println(parsedDate);
SimpleDateFormat outformat = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(outformat.format(parsedDate));

Вывод:

Wed Mar 11 00:00:00 CET 2020
2020-03-11
0 голосов
/ 12 марта 2020

Сначала вам нужно контролировать свой компьютерный язык. В зависимости от языка вашего компьютера. Вы должны написать название дня и месяца на языке вашего компьютера

На самом деле вам лучше конвертировать это «ср» в соответствии с вашим языком.

Мой компьютер - turki sh. Я использовал приведенный ниже код, как использовать название дня для даты на java.

public static void main(String[] args) { 
    String sDate1 = "Per Mar-11-2020";  
    String sDate2 = "Perşembe Mar-11-2020";  
    Date date1;
    try {
        date1 = new SimpleDateFormat("EEE MMM-dd-yyyy").parse(sDate1);
        System.out.println(sDate1+"\t\t"+date1);
        date1 = new SimpleDateFormat("EEEEE MMM-dd-yyyy").parse(sDate2);
        System.out.println(sDate2+"\t\t"+date1);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }       
}

вывод:

Per Mar-11-2020     Wed Mar 11 00:00:00 AST 2020
Perşembe Mar-11-2020        Wed Mar 11 00:00:00 AST 2020

Также вам нужно быть осторожным, например:

если ваша строка в период с 11 по 112020 , вам нужно написать EEE MMM-dd-гггг .

или

, если ваш Строка на 11 марта 2020 , вам нужно написать EEE MMM дд гггг .

или

, если ваша строка на мар / 11/2020 , вам нужно написать EEE MMM / dd / yyyy .

0 голосов
/ 12 марта 2020

Попробуйте это.

    SimpleDateFormat sdf3 = new SimpleDateFormat("EEE MMM dd yyyy");
    Date d1 = null;
    try {
        d1 = sdf3.parse("Wed Mar 30 2016");
    } catch (Exception e) {
        e.printStackTrace();
    }

    System.out.println(sdf3.format(d1));

}

Вывод:

Wed Mar 30 2016
...