Как разбирать дату?

Я пытаюсь проанализировать эту дату с помощью 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" , у меня есть положительный ответ. В чем проблема? Как я могу разобрать этот формат?

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

    5 Solutions collect form web for “Как разбирать дату?”

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

    Чтобы проанализировать строку даты «Thu Jun 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); ... 

    JavaDoc: 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 поставляется с Java 8 и более поздними версиями . См. Учебник . Эти новые classы вдохновлены Joda-Time , определенными JSR 310 , и расширены проектом ThreeTen-Extra . Это огромное улучшение по сравнению с трудными старыми classами, java.util.Date/.Calendar et al.

    Обратите внимание, что 3-4 буквенных кода, таких как EDT , не являются ни стандартизированными, ни уникальными. Избегайте их, когда это возможно. Научитесь использовать стандартные форматы ISO 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 ); 

    При запуске.

    zdt: 2009-06-18T20: 56: 02-04: 00 [America / New_York]

    Настройка часового пояса

    Для удовольствия давайте приспособиться к часовому поясу Индии.

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

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

    Преобразовать в juDate

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

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

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

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

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

    В ответ на: « Как конвертировать Tue Sep 13 2016 00:00:00 GMT-0500 (Hora de verano central (México)) в dd-MM-yy в 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); } 
    Interesting Posts
    Давайте будем гением компьютера.