SimpleDateFormat, нужен текстовый месяц - PullRequest
1 голос
/ 07 февраля 2012

У меня это в виде строки 02/06/2012 1:25 PM EST

Я хочу использовать SimpleDateFormat для возврата "Feb" из этих данных

Вот что я пытался

SimpleDateFormat gottenDate = new SimpleDateFormat("MMM");
            String month = "";
            try {
                month = gottenDate.format(gottenDate.parse("02/06/2012 1:25 PM EST"));
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

К сожалению gottenDate.parse("02/06/2012 1:25 PM EST") получает исключение синтаксического анализа, когда в документах SimpleDateFormat сказано, что оно должно работать.

Если я сделаю SimpleDateFormat gottenDate = new SimpleDateFormat("MM"); с двумя буквами M вместо 3, он вернет мне "02", как и ожидалось.В документах говорится, что 3 или более М должны возвращать текстовый месяц.Этого не происходит, почему?И да, к настоящему времени я мог бы создать массив строк месяцев и сопоставить их с числом, которое SDF вернул для меня, но мне любопытно.

Как мне заставить его работать, спасибо!

Ответы [ 6 ]

2 голосов
/ 07 февраля 2012

В вашем случае ожидается исключение:

SimpleDateFormat gottenDate = new SimpleDateFormat("MMM");
gottenDate.parse("02/06/2012 1:25 PM EST");

"gottenDate" настроен на синтаксический анализ строки, если она соответствует шаблону "MMM".Должно работать следующее:

SimpleDateFormat gottenDate = new SimpleDateFormat("MMM");
gottenDate.parse("Feb");

Надеюсь, вы увидите, что здесь происходит.

0 голосов
/ 07 февраля 2012

Просто чтобы предложить альтернативное решение, поскольку ваша работа заключается в том, чтобы «извлечь» месяц даты, я думаю, Календарь лучше всего подходит для работы.

// Construct a Date object
final DateFormat df = new SimpleDateFormat("M/d/y");
final Date originalDate = df.parse("02/06/2012 1:25 PM EST");

final Calendar c = Calendar.getInstance();
c.setTime(originalDate); // set the calendar Date
// Extract the month
String month = c.getDisplayName(Calendar.MONTH, Calendar.SHORT, Locale.US);
System.out.println(month); 
0 голосов
/ 07 февраля 2012

Ну, другие ответили быстрее, но я думаю, что это будет делать то, что вы хотите.

String date_str = "02/06/2012 1:25 PM EST";
SimpleDateFormat in_format = new SimpleDateFormat("MM/dd/yyyy h:mm aa zzz");
SimpleDateFormat out_format = new SimpleDateFormat("MMM");
Date my_date = in_format.parse(date_str);
String out_str = out_format.format(my_date);
System.out.println(out_str); // Prints Feb

Даты и время могут быть сложными из-за того, что люди в разное время записи. Лучшая ссылка, которую я нашел для понимания всего этого, здесь: http://www.odi.ch/prog/design/datetime.php

0 голосов
/ 07 февраля 2012

Это код, который получит вам MonthName:

public String getMonthName(String dtstr, String fmt) throws ParseException {
   SimpleDateFormat gottenDate = new SimpleDateFormat(fmt);
   SimpleDateFormat month = new SimpleDateFormat("MMM");
   Date dt = gottenDate.parse(dtstr);
   return month.format(dt);
}

Назовите его так:

System.out.println(getMonthName("01/06/2012 1:25 PM EST"), "M/d/y");

ВЫХОД:

Feb
0 голосов
/ 07 февраля 2012

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

SimpleDateFormat monthDate = new SimpleDateFormat("MMM");
SimpleDateFormat gottenDate = new SimpleDateFormat("dd/MM/yyyy h:mm a z");
String month = "";
try {
    month = monthDate .format(gottenDate.parse("02/06/2012 1:25 PM EST"));
} catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

Не уверен насчет формата исходной строки, строки сложного формата немного сложнее.

0 голосов
/ 07 февраля 2012

Вам нужен формат для разбора даты: MM/dd/yyyy, и как только у вас будет объект Date из этого первого формата даты, вам понадобится второй: MMM, чтобы отформатировать дату так, как вы хотите.

Форматирование с помощью MM даст вам месяц из двух цифр, а при синтаксическом анализе с MMM будет ожидаться сокращенный текстовый месяц, и он не будет анализироваться 02.

...