Возвращает понедельник, 18 сентября 2017 г. GMT + 03: 00 23:04:10.

гда получаю исключение синтаксического анализа, даже если проверяемый формат и строковое значение совпадают. Вот код:

String format = "EEE MMM dd HH:mm:ss z yyyy";
String value = "Mon Sep 18 10:30:06 MST 2017";
public static boolean isValidFormat(String format, String value) {
    Date date = null;
    try {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        date = sdf.parse(value); // here it breaks
        if (!value.equals(sdf.format(date))) {
            date = null;
        }
    } catch (ParseException ex) {
        ex.printStackTrace(); //java.text.ParseException: Unparseable date: 
                                "Mon Sep 18 10:30:06 MST 2017" (at offset 0)
    }
    return date != null;
}
 Cristian Gomez18 сент. 2017 г., 19:57
Я думаю, что проблема с часовым поясом, когда я запускаю ваш код без z и MST, он возвращает true, возможно, MST это не тот способ, которым SimpleDateFormatter ожидает.
 Alok Kumar Verma18 сент. 2017 г., 19:50
Что вы хотите сделать? Подскажите тогда я сам пойду как дать решение ответа
 Alok Kumar Verma18 сент. 2017 г., 19:59
Я даю код форматера даты, просто проверьте, работает ли он у вас или нет. Если это работает, не забудьте пометить его как правильный ответ.
 Alok Kumar Verma18 сент. 2017 г., 19:57
Хотите получить код dateFormatter ()?
 sai18 сент. 2017 г., 19:54
на самом деле вышеуказанное «значение» даты я извлекаю из базы данных, и мне нужно преобразовать вышеуказанное значение даты в другой формат. Итак, сначала я изменяю приведенное выше строковое значение на дату, а затем конвертирую полученную дату в нужный мне формат, используя другой sdf

Ответы на вопрос(3)

что и вы, только с небольшой разницей в инстанцировании SimpleDateFormat.

public static final String DATE_FORMAT = "EEE MMM d yyyy z HH:mm:ss";
SimpleDateFormat simp,leDateFormat = new SimpleDateFormat(DATE_FORMAT, Locale.ROOT);
simpleDateFormat.format(date);

Возвращает понедельник, 18 сентября 2017 г. GMT + 03: 00 23:04:10.

который поможет вам конвертировать вашу дату в любой формат времени.

public void setDate(String date) {
            dateInput = (TextView) itemView.findViewById(R.id.dateText);
            DateFormat inputFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
            try {
                dateData = inputFormat.parse(date);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            DateFormat outputFormat = new SimpleDateFormat("pur your desirable format");
            String outputString = outputFormat.format(dateData);
            dateInput.setText(outputString);
        }
 sai18 сент. 2017 г., 20:25
Единственное изменение - вы изменили SDF на DateFormat. Я пытался использовать тот же код, но он выдает ошибку
 sai18 сент. 2017 г., 20:06
Спасибо за быстрый ответ. Но я вижу, что мой код такой же, как у вас. Как вы думаете, есть ли проблемы с моим кодом?
 Alok Kumar Verma18 сент. 2017 г., 20:09
старайтесь не помещать DateFormat в ваш блок try и catch и, пожалуйста, приведенный выше код, потому что в нем есть разница. Вы просто видите, что я использовал этоDateFormat inputFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");

что ваша строка даты и времени не разбирается с индексом 0. Индекс 0 - это то, где он говоритMonТаким образом, трехбуквенное сокращение часового пояса не является первым подозреваемым. Локаль есть. «Пн» работает как аббревиатура понедельника на английском, но не на многих других языках. Поэтому, если ваше устройство имеет настройку не на английском языке - возможно, она даже была недавно изменена - это полностью объяснит ваши наблюдения.

Недальновидное решение

        SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.ROOT);

я используюLocale.ROOT означать, что никакая языковая обработка не должна быть сделана. Если ваша строка написана на английском языке, потому что английский, как правило, является языком, используемым для вычислений по всему миру, я считаю этот выбор подходящим. Если, с другой стороны, он написан на английском языке, потому что он исходит из англоязычного языка, этот язык будет правильным для использования.

С этим изменением на моем компьютере ваш код форматирует вашу дату вMon Sep 18 11:30:06 MDT 2017, который, как вы можете видеть, не совпадает со значением, с которого мы начали, поэтому ваш метод возвращает false. Моя JVM понимала MST как горное стандартное время, а затем приняла летнее время (DST) в сентябре и отформатировала строку соответствующим образом.

ThreeTenABP

Это сказало,Date а такжеSimpleDateFormat давно устаревшие классы. Вам следует подумать, чтобы избавиться от них и использовать вместо этого современный API даты и времени Java. На Android вы получаете его в ThreeTenABP, смотритена этот вопрос: как использовать ThreeTenABP в Android Project, Теперь вы можете сделать:

    DateTimeFormatter dtf = DateTimeFormatter.ofPattern(format, Locale.ROOT);
    try {
        return ZonedDateTime.parse(value, dtf).format(dtf).equals(value); 
    } catch (DateTimeParseException dtpe) {
        dtpe.printStackTrace();
        return false;
    }

Это ведет себя так же, как указано выше.

Трехбуквенные сокращения часовых поясов

Вы должны избегать трех- и четырехбуквенных сокращений часовых поясов, где это возможно. Они не стандартизированы и, как правило, неоднозначны. MST, например, может означать стандартное время Малайзии или стандартное время в горах. Последний даже не полный часовой пояс, так как MDT используется большую часть года, что вызвало проблему, которую я наблюдал, как я сказал выше.

Вместо этого посмотрите, можете ли вы получить строку в формате ISO 8601, например2017-09-18T10:30:06+08:00, Во-вторых, просто получите что-то однозначное. Одним из способов является включение смещения от UTC, а не идентификатора часового пояса (или обоих).

 sai18 сент. 2017 г., 22:35
@Ole V.V Да, клиент сообщил, что он изменил язык устройства на испанский, это вызвало ошибку. когда он снова изменил устройство на английский, это сработало.
 user760532518 сент. 2017 г., 22:01
Что касается MST против MDT, я провел несколько тестов, и при разборе MST по умолчанию использует Америку / Денвер (который имеет DST) - вы можете проверить, позвонивsdf.getTimeZone().getID() после разбора (да, проанализированный часовой пояс устанавливается в форматере, почему?). Но, возможно, часовой пояс по умолчанию для ОП - это тот, который не имеет летнего времени (например, Америка / Феникс), и это объясняет, почему на входе есть MST в сентябре.

Ваш ответ на вопрос