【问题标题】:Find Date Anywhere In Timestamp在时间戳中的任何位置查找日期
【发布时间】:2019-01-10 14:20:16
【问题描述】:

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

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

数据在字符串开头的位置或:

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

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

【问题讨论】:

  • /[\d]{4}-[\d]{2}-[\d]{2}/g
  • @Chris Java,不是 javascript。此外,这里不需要方括号。
  • 是的,只是向正确的方向投掷了一点。因此评论不回答。不过,在这里感谢您的反馈

标签: java timestamp


【解决方案1】:

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

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
}

【讨论】:

  • 仅供参考,您可以只对整个正则表达式使用 group(0),这样就不需要括号了。
  • 太棒了,谁能解释一下 find 的作用?
  • 这里有一个很好的解释:stackoverflow.com/questions/4450045/…
【解决方案2】:

正则表达式太过分了

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

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-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

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

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

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多