在时间戳记中的任何地方查找日期

时间:2019-01-10 14:20:16

标签: java timestamp

有没有办法在时间戳的任何地方查找日期?例如,

2017-01-31 01:33:30随机文本日志消息x

数据在字符串的开头或:

2017-01-31 01:33:30随机文本日志消息x

日期在中间。您如何解析每个字符串以获取Java中的日期?

2 个答案:

答案 0 :(得分:6)

是的,您可以按以下方式使用正则表达式来检索日期。

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
}

答案 1 :(得分:1)

正则表达式过大了

这里不需要棘手的正则表达式匹配。只需将日期时间文本解析为日期时间对象即可。

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及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore