提取日期并从Scala中的字符串比较它们

时间:2018-08-14 21:02:10

标签: scala datetime jvm

我正在尝试从字符串中提取日期并进行比较。我是Scala的新手。字符串:Some(Date: Tue, 14 Aug 2018 20:57:42 GMT)Some(Last-Modified: Tue, 14 Aug 2018 20:57:24 GMT)我想共同映射DateLast Modified

2 个答案:

答案 0 :(得分:2)

如果与Option一起使用,则提取日期

Java Time API有多个Scala包装器,但是下面的示例仅直接使用Java API。

val someDate: Option[String] = Some("Date: Tue, 14 Aug 2018 20:57:42 GMT")
val someLastMod: Option[String] = Some("Last-Modified: Tue, 14 Aug 2018 20:57:24 GMT")

我们提取有意义的日期子字符串,即。我们删除了"Date: "

val dateStr = someDate.get.split("^[\\w\\-]+:")(1).trim
val lastModStr = someLastMod.get.split("^[\\w\\-]+:")(1).trim

您应注意,以上使用get(),它假定您可以保证自己永远有Some,而永远不会有None。如果您不了解这一点,则应该阅读在Scala中使用Option的内容。

如果使用String

,则提取日期
val data = "Some(Date: Tue, 14 Aug 2018 20:57:42 GMT)Some(Last-Modified: Tue, 14 Aug 2018 20:57:24 GMT)"

首先,我们只提取我们感兴趣的字符串日期。下面的表达式使用split创建字符串数组,我们filter将其删除以删除所有空字符串,然后最终映射到剩下的字符串上并使用take删除尾括号)

val dates = data.split("Some\\([\\w\\-]+:*\\s").filter(_.nonEmpty).map(_.take(29))

// dates: Array[String] = Array(Tue, 14 Aug 2018 20:57:42 GMT, Tue, 14 Aug 2018 20:57:24 GMT)

现在,我们从数组中提取每个日期字符串。

val dateStr = dates(0)
val lastModStr = dates(1)

现在使用Java Time API进行比较。

现在,我们开始使用Java时间API。首先,您需要导入Java包。

import java.time._
import java.time.format._

现在创建一个格式化程序以匹配您的DateTime模式,以便将Strings转换为LocalDateTime实例。

val formatter = DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss z")    

val date = LocalDateTime.parse(dateStr, formatter)
val lastMod = LocalDateTime.parse(lastModStr, formatter)

使用LocalDateTime API进行一些比较。

date.isBefore(lastMod)
date.isAfter(lastMod)

请查看LocalDateTime文档,以获取更多比较它们的方法。

考虑一下

日期的格式是否始终采用相同的格式?否则,您将需要考虑如何处理不同的模式,否则会遇到运行时异常(DateTimeParseException)。在docs

中了解更多信息

答案 1 :(得分:1)

您是否真的要解析看起来像这样的数据?

val badString = "Some(Date: Tue, 14 Aug 2018 20:57:42 GMT)Some(Last-Modified: Tue, 14 Aug 2018 20:57:24 GMT)"

任何认为可能是表示数据的合理方法的人都应该回到学校(小学)。但这是可以完成的。首先,让我们尝试分离我们感兴趣的数据元素,并一路消除一些麻烦。

val inArray :Array[String] = badString.split("Some[^:]+: ")
//inArray: Array[String] = Array("", "Tue, 14 Aug 2018 20:57:42 GMT)", "Tue, 14 Aug 2018 20:57:24 GMT)")

接下来,我们需要描述我们要处理的日期/时间格式。请注意,我们必须在数据中考虑尾随)

import java.time.format.DateTimeFormatter
val dtFormatter = DateTimeFormatter.ofPattern("E, dd MMM yyyy HH:mm:ss z)")

现在,我们可以将所有好的数据转换成Java LocalDateTime元素。与Array模式不匹配的所有DateTimeFormatter元素都将被删除。

import util.Try
import java.time.LocalDateTime
val dates :Array[LocalDateTime] = inArray.flatMap{ dateStr =>
  Try(LocalDateTime.parse(dateStr.trim, dtFormatter)).toOption
}

现在,您可以从dates数组中提取日期(如果有的话),并使用LocalDateTime API进行比较。