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