Разбор дат в формате «10 января 2010» на Java? (с порядковыми указателями, st | nd | rd | th) - PullRequest
11 голосов
/ 18 января 2011

Мне нужно разобрать даты формата "10 января 2010" в Java. Как я могу это сделать?

Как обрабатывать порядковые индикаторы , st, nd, rd или th, тянущие номер дня?

Ответы [ 3 ]

9 голосов
/ 18 января 2011

Это работает:

String s = "January 10th, 2010";
DateFormat dateFormat = new SimpleDateFormat("MMM dd yyyy");
System.out.println("" + dateFormat.parse(s.replaceAll("(?:st|nd|rd|th),", "")));

но вам нужно убедиться, что вы используете правильный Locale для правильного анализа названия месяца.

Я знаю, что вы можете включить общие тексты в шаблон SimpleDateFormat. Однако в этом случае текст зависит от информации и на самом деле не имеет отношения к процессу анализа.

Это на самом деле самое простое решение, которое я могу придумать. Но я бы хотел, чтобы меня показывали неправильно.

Вы можете избежать ошибок, выявленных в одном из комментариев, выполнив нечто похожее на это:

String s = "January 10th, 2010";
DateFormat dateFormat = new SimpleDateFormat("MMM dd yyyy");
System.out.println("" + dateFormat.parse(s.replaceAll("(?<= \\d+)(?:st|nd|rd|th),(?= \\d+$)", "")));

Это позволит вам не совпадать, например, Jath,uary 10 2010.

1 голос
/ 18 января 2011

Вы можете установить nd и т.д. как литералы в SimpleDateFormat . Вы можете определить четыре необходимых формата и попробовать их. Сначала начнем с th, потому что, я думаю, это будет происходить чаще. Если это не удастся с ParseException, попробуйте следующий. Если все не получается, выведите ParseException. Код здесь - это просто концепция. В реальной жизни вы можете не создавать новые форматы каждый раз и думать о безопасности потоков.

public static Date hoolaHoop(final String dateText) throws ParseException
        {
        ParseException pe=null;
        String[] sss={"th","nd","rd","st"};
        for (String special:sss)
        {
        SimpleDateFormat sdf=new SimpleDateFormat("MMMM d'"+special+",' yyyy");

        try{
        return sdf.parse(dateText);
        }
        catch (ParseException e)
        {
        // remember for throwing later 
        pe=e;
        }
        }
        throw pe;
        }
        public static void main (String[] args) throws java.lang.Exception
        {
         String[] dateText={"January 10th, 2010","January 1st, 2010","January 2nd, 2010",""};
         for (String dt:dateText) {System.out.println(hoolaHoop(dt))};
        }

Выход:

вс 10 января 00:00:00 по Гринвичу 2010

Пт. 01 января 00:00:00 GMT 2010

Сб 02 января 00:00:00 по Гринвичу 2010

Исключение в потоке "main" java.text.ParseException: Непроясуемая дата: ""

"th","nd","rd","st", конечно, подходит только для языков с английским языком. Запомни. Во Франции "re","nd" и т.д., я думаю.

0 голосов
/ 18 января 2011

Это еще один простой способ, но нужно включить apache commons jar .

import org.apache.commons.lang.time.*;

String s = "January 10th, 2010";
String[] freakyFormat = {"MMM dd'st,' yyyy","MMM dd'nd,' yyyy","MMM dd'th,' yyyy","MMM dd'rd,' yyyy"};
DateUtils du = new DateUtils();
System.out.println("" + du.parseDate(s,freakyFormat));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...