Разобрать дату из строки в следующем формате: дд / мм / гггг [в дд / мм / гггг] - PullRequest
4 голосов
/ 02 августа 2010

Я думаю, что в Java лучше всего анализировать строку с этим форматом дд / мм / гггг [в дд / мм / гггг].Строка с [] является необязательной, и dd обозначает двухзначное представление дат, MM - двухзначное представление месяца, а yyyy - четырехзначное представление года.


Обновление

Спасибо, ребята, за быстрый ответ, однако я забыл вам сказать, что [] означает символ опционально, в строке нет [], образец строки может быть

  • 22/01/2010
  • 22/01/2010 по 23/01/2010
  • null

Текущий я написалкод таким образом, работает, но безобразно = (

String _daterange = (String) request.getParameter("daterange");
    Date startDate = null, endDate = null;
    // Format of incoming dateRange is 
    if (InputValidator.requiredValidator(_daterange)) {
        String[] _dateRanges = _daterange.toUpperCase().split("TO");
        try {
            startDate = (_dateRanges.length > 0) ? sdf.parse(_dateRanges[0]) : null;
            try{
                endDate = (_dateRanges.length > 1) ? sdf.parse(_dateRanges[1]) : null;
            }catch(Exception e){
                endDate = null;
            }
        } catch (Exception e) {
            startDate = null;
        }
    }

Ответы [ 4 ]

12 голосов
/ 02 августа 2010

Используйте java.text.DateFormat и java.text.SimpleDateFormat, чтобы сделать это.

DateFormat sourceFormat = new SimpleDateFormat("dd/MM/yyyy");
String dateAsString = "25/12/2010";
Date date = sourceFormat.parse(dateAsString);

UPDATE:

Если у вас есть две даты, скрывающиеся в этой строке, вам придется разбить их на две части. Я думаю, что другие указали на идею «раскола». Я просто сломал бы пробел и выбросил бы «ТО».

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

1 голос
/ 09 апреля 2017

tl; dr

LocalDate.parse( 
    "22/01/2010" , 
    DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) 
)

… больше…

// String input is:
// (a) long: "22/01/2010 to 23/01/2010". 
// (b) short: "22/01/2010".
// (c) null.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ;

if( input.length() == 24 ) {           // Ex: "22/01/2010 to 23/01/2010"
    List<LocalDate> lds = new ArrayList<>( 2 );
    String[] inputs = input.split( " to " );
    for( String nthInput : inputs ) {
        LocalDate ld = LocalDate.parse( nthInput , f ) ;
        lds.add( ld );
    }
    … // Do what you want with `LocalDate` objects collection.

} else if( input.length() == 10 ) {    // Ex: "22/01/2010"
    LocalDate ld = LocalDate.parse( input , f ) ;
    … // Do what you want with `LocalDate` object.

} else if( null == input ) {
    … // Decide what you want to do for null input.

} else {
    System.out.println( "Unexpected input: " + input ) ;
}

См. Этот код, запущенный на IdeOne.com .

Использованиеjava.time

В других ответах используются проблемные старые классы даты и времени, которые теперь унаследованы и заменены классами java.time.

Что касается обработки нескольких типов строк, посмотрите на длину строки.

if( input.length() == 10 ) { … }

Если длинная, разделить на 4-символьную подстроку «to».

String[] inputs = "22/01/2010 to 23/01/2010".split( " to " );

Разобрать строку даты как LocalDate.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
LocalDate ld = LocalDate.parse( "22/01/2010" , f );

О java.time

Среда java.time встроена в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar и & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, а позже
    • Встроенный.
    • Часть стандартного Java API с встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.Java SE 6 и Java SE 7
      • Большая часть функций java.time перенесена на Java 6 & 7 в ThreeTen-Backport .
    • Android
      • Более поздние версии реализации комплекта Android классов java.time .
      • Для более ранних версий Android (<26) <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP проект адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

    ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 02 августа 2010

вы можете сделать что-то вроде этого -

String input = "02/08/2010 [to 31/12/2010]";
    java.text.DateFormat format = new java.text.SimpleDateFormat("dd/MM/yyyy");
    java.util.Date d = null;
    try {
        d = format.parse(input.split(" ")[0]);
    } catch (java.text.ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println(d) ;

если строка с [] отсутствует, то все же input.split(" ")[0] вернет только первую строку.

0 голосов
/ 02 августа 2010

Примерно так должно получиться:

String input = "02/08/2010 [to 31/12/2010]";
DateFormat format = new SimpleDateFormat("dd/MM/yyyy");
Date d  = format.parse(input.split(" ")[0]);
System.out.println(d) ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...