Я хочу изменить формат даты с заданным часовым поясом. Я пробовал это с SimpleDateFormat, но все равно не удалось

Дата Wed Jun 21 14:14:23 GMT+08:00 2017, и я хочу преобразовать ее в 2017-06-21.

Вот мой код:

String date = "Wed Jun 21 14:14:23 GMT+08:00 2017";
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMMM dd HH:mm:ss 'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
SimpleDateFormat outputDate = new SimpleDateFormat("yyyy-MM-dd");
Date d = null;
try {
    d = sdf.parse(date);
} catch (ParseException e) {
    e.printStackTrace();
}

person Manpreet Singh    schedule 13.06.2017    source источник
comment
каким образом не удалось.. Покажите нам код, который вы пробовали до сих пор.   -  person Rameshbabu    schedule 13.06.2017
comment
проверьте этот вопрос для преобразования пн 18 июня 000000 ist 2012 в 18 06 2012 "> stackoverflow.com/questions/11097256/   -  person Rameshbabu    schedule 13.06.2017
comment
спасибо за быстрый ответ @Rameshbabu позвольте мне проверить эту ссылку   -  person Manpreet Singh    schedule 13.06.2017
comment
Великий человек, это то, чего я хочу .. @Rameshbabu   -  person Manpreet Singh    schedule 13.06.2017
comment
опубликуйте свой ответ. Чтоб другим было полезно..   -  person Rameshbabu    schedule 13.06.2017


Ответы (3)


Прежде всего, я рекомендую вам отказаться от использования старых классов Date и SimpleDateFormat. Они устарели, полны ошибок и проблем с дизайном и заменен новым API даты/времени.

Если вы используете Java 8, рассмотрите возможность использования нового java. API времени.

Если вы используете Java ‹= 7, вы можете использовать ThreeTen Backport, отличный бэкпорт для новых классов даты/времени Java 8. А для Android есть ThreeTenABP (подробнее о том, как его использовать здесь).

Код ниже работает для обоих. Единственная разница заключается в именах пакетов (в Java 8 — java.time, а в ThreeTen Backport (или ThreeTenABP для Android) — org.threeten.bp), но имена классов и методов одинаковы.

Чтобы проанализировать нужный String, просто создайте DateTimeFormatter и установите java.util.Locale на английский язык, чтобы убедиться, что дни недели и названия месяцев (в вашем случае Wed и Jun) анализируются правильно. Если вы не установите локаль, будет использоваться система по умолчанию (и если по умолчанию не английский язык, это не сработает).

String date = "Wed Jun 21 14:14:23 GMT+08:00 2017";
// create formatter (using English locale to make sure weekdays and month names are parsed correctly)
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH);
// parse local date
LocalDate dt = LocalDate.parse(date, fmt);
System.out.println(dt.toString()); // 2017-06-21

Результат:

2017-06-21

person Community    schedule 13.06.2017

Попробуйте это работает идеально

String  formatDate = "Wed Jun 21 14:14:23 GMT+08:00 2017";
        java.text.SimpleDateFormat dateTimeFormat = new java.text.SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy" , Locale.ENGLISH);
        java.text.SimpleDateFormat dateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd",Locale.ENGLISH);

        Date date = null;
        try {
            date = dateTimeFormat.parse(formatDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        String format = dateFormat.format(date);

        Log.d("===========>>>>>",format);
person Anil    schedule 13.06.2017

Попробуйте это, и это работает, как вы хотите.

String input_date = "Wed Jun 21 14:14:23 GMT+08:00 2017";
SimpleDateFormat fromthis = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzzz yyyy", Locale.ENGLISH);
SimpleDateFormat tothis = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
Date date = null;
try {
       date = fromthis.parse(input_date);
    } catch (ParseException e) {
       e.printStackTrace();
    }
String result = tothis.format(date);
System.out.println(result);

Ввод: ср, 21 июня, 14:14:23 GMT+08:00 2017

Выход: 21 июня 2017 г.

Спасибо.

person Rameshbabu    schedule 13.06.2017