Найти дату где-нибудь в метке времени - PullRequest
0 голосов
/ 10 января 2019

Есть ли способ найти дату где-нибудь в метке времени? Например,

2017-01-31 01:33:30 случайное текстовое сообщение в журнале x

где данные находятся в начале строки или:

01: 33: 30 2017-01-31 случайное текстовое сообщение журнала x

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

Ответы [ 2 ]

0 голосов
/ 11 января 2019

регулярное выражение является излишним

Здесь нет необходимости в хитром сопоставлении регулярных выражений. Просто проанализируйте текст даты и времени как объекты даты и времени.

java.time

В вашем примере используются только два формата. Поэтому попытайтесь проанализировать каждый из них, используя современные java.time классы. Они похожи, один - дата первый, другой - день первый.

DateTimeFormatter fDateTime = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" ) ;
DateTimeFormatter fTimeDate = DateTimeFormatter.ofPattern( "HH:mm:ss uuuu-MM-dd" ) ;

Сначала извлеките первые 19 символов из вашей строки, чтобы сосредоточиться только на данных даты и времени.

Разбор, отлов для DateTimeParseException.

LocalDateTime ldt = null ;

try{
    if( Objects.isNull( ldt ) {
        LocalDateTime ldt = LocalDateTime.parse( input , fDateTime ) ;
    }
} catch ( DateTimeParseException e ) {
    // Swallow this exception in this case.
}

try{
    if( Objects.isNull( ldt ) {
        LocalDateTime ldt = LocalDateTime.parse( input , fTimeDate ) ;
    }
} catch ( DateTimeParseException e ) {
    // Swallow this exception in this case.
}

// If still null at this point, then neither format above matched the input.
if( Objects.isNull( ldt ) {
    // TODO: Deal with error condition, where we encountered data in unexpected format. 
}

Если вы хотите использовать только дату без времени, извлеките объект LocalDate.

LocalDate ld = ldt.toLocalDate() ;

О java.time

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

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

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

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

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

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

0 голосов
/ 10 января 2019

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

Pattern p = Pattern.compile("(\\d{4}-\\d{2}-\\d{2})");
Matcher m = p.matcher("2017-01-31 01:33:30 random text log message x");

if (m.find()) {
    System.out.println(m.group(1)); //print out the date
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...