Вопрос

На этот вопрос уже есть ответ здесь:

Я пытаюсь проанализировать эту дату с помощью SimpleDateFormat и он не работает:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Formaterclass {
    public static void main(String[] args) throws ParseException{
        String strDate = "Thu Jun 18 20:56:02 EDT 2009";
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        Date dateStr = formatter.parse(strDate);
        String formattedDate = formatter.format(dateStr);
        System.out.println("yyyy-MM-dd date is ==>"+formattedDate);
        Date date1 = formatter.parse(formattedDate);

        formatter = new SimpleDateFormat("dd-MMM-yyyy");
        formattedDate = formatter.format(date1);
        System.out.println("dd-MMM-yyyy date is ==>"+formattedDate);
    }
}

Если я попробую этот код с помощью strDate="2008-10-14", у меня положительный ответ.В чем проблема?Как я могу разобрать этот формат?

ПС.Я получил эту дату от jDatePicker и нет инструкций о том, как изменить формат даты, который я получаю, когда пользователь выбирает дату.

Это было полезно?

Решение

Вы не можете рассчитывать на анализ даты с помощью SimpleDateFormat, настроенного в другом формате.

Чтобы проанализировать строку даты «Четверг, 18 июня 20:56:02 EDT 2009», вам понадобится SimpleDateFormat, подобный этому (примерно):

SimpleDateFormat parser=new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");

Используйте это, чтобы преобразовать строку в дату, а затем другой SimpleDateFormat, чтобы преобразовать эту дату в нужный вам формат.

        String input = "Thu Jun 18 20:56:02 EDT 2009";
        SimpleDateFormat parser = new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");
        Date date = parser.parse(input);
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        String formattedDate = formatter.format(date);

        ...

JavaДок: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

Другие советы

Проблема в том, что у вас дата в таком формате:

Thu Jun 18 20:56:02 EDT 2009

Но мы используем SimpleDateFormat то есть:

yyyy-MM-dd

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

EEE MMM dd HH:mm:ss zzz yyyy
Thu Jun 18 20:56:02 EDT 2009

Проверьте страницу JavaDoc, на которую я ссылаюсь, и посмотрите, как используются символы.

Теперь у нас есть более современный способ выполнить эту работу.

java.time

А java.time framework входит в состав Java 8 и более поздних версий.Видеть Руководство.Эти новые классы вдохновлены Джода-Время, определяется ДжСР 310, и расширенный ТриДесять-Экстра проект.Они представляют собой значительное улучшение по сравнению с неприятными старыми классами java.util.Date/.Calendar и др.

Обратите внимание, что 3-4-буквенные коды, такие как EDT не являются ни стандартизированными, ни уникальными.Избегайте их, когда это возможно.Научитесь использовать ИСО 8601 вместо этого стандартные форматы.Фреймворк java.time может испытывать трудности с переводом, но многие из часто используемых кодов имеют повторяющиеся значения.

Кстати, обратите внимание, что java.time по умолчанию генерирует строки, используя форматы ISO 8601, но расширяемые добавлением названия часового пояса в скобках.

String input = "Thu Jun 18 20:56:02 EDT 2009";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "EEE MMM d HH:mm:ss zzz yyyy" , Locale.ENGLISH );
ZonedDateTime zdt = formatter.parse ( input , ZonedDateTime :: from );

Дамп на консоль.

System.out.println ( "zdt : " + zdt );

При беге.

здт:2009-06-18T20:56:02-04:00[Америка/Нью_Йорк]

Настроить часовой пояс

Ради интереса давайте подстроимся под часовой пояс Индии.

ZonedDateTime zdtKolkata = zdt.withZoneSameInstant ( ZoneId.of ( "Asia/Kolkata" ) );

zdtКалькутта:2009-06-19T06:26:02+05:30[Азия/Калькутта]

Преобразовать в j.u.Date

Если вам действительно нужен объект java.util.Date для использования с классами, которые еще не обновлены до типов java.time, преобразуйте.Обратите внимание, что вы теряете назначенный часовой пояс, но тот же момент автоматически корректируется универсальное глобальное время.

java.util.Date date = java.util.Date.from( zdt.toInstant() );

Как насчет получить выбранную дату?В любом случае, конкретно по вашему вопросу о коде, проблема в этой строке:

new SimpleDateFormat("yyyy-MM-dd");

Строка, которая входит в конструктор, должна соответствовать формату даты.Документация о том, как это сделать, здесь.Похоже, вам нужно что-то похожее на "EEE MMM d HH:mm:ss zzz yyyy"

В ответ на:"Как преобразовать вторник, 13 сентября 2016 г., 00:00:00 GMT-0500 (Центральная Гора-де-Верано (Мексика)) в дд-ММ-гг на Java?", было отмечено, насколько дублируются

Попробуй это:С java.util.Date, java.text.SimpleDateFormat, это простое решение.

public static void main(String[] args) throws ParseException {

    String fecha = "Tue Sep 13 2016 00:00:00 GMT-0500 (Hora de verano central (México))";
    Date f = new Date(fecha);

    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    sdf.setTimeZone(TimeZone.getTimeZone("-5GMT"));
    fecha = sdf.format(f);
    System.out.println(fecha);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top