Scala中两个日期之间的月差异

时间:2016-08-11 14:56:20

标签: scala jodatime

我在Scala的格式'yyyy-MM-dd'中有两个日期,它们都是一个月的最后一天(2015-05-31),我想在那之间找到月份差异。我有以下代码,但找到月份差异并不简单。

 val format = new java.text.SimpleDateFormat("yyyy-MM-dd")         
 val diff = format.parse(date1).getTime - format.parse(date2).getTime

 val days = TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS)

有什么更好的建议吗?

3 个答案:

答案 0 :(得分:3)

如果您使用的是Java 8或更高版本,则可以在java.time包中使用新的日期和时间API。

首先,您创建两个LocalDate个对象:

import java.time._
val s1 = LocalDate.parse("2012-05-31")
val s2 = LocalDate.parse(otherDate)

然后你有两个选择。第一个选项,直接使用ChronoUnit个对象:

import java.time.temporal._
ChronoUnit.MONTHS.between(s1, s2)   // the answer you are looking for

或创建一个Period对象,用于表示时间段。

val p = Period.between(s1, s2)
p.getMonths() // returns the number of months between the two dates

Period类具有其他方法,例如getDays(),使您可以获取有关两个日期之间的时间段的更多信息。

答案 1 :(得分:1)

JodaTime中有一种特殊方法:

monthsBetween

  

创建一个月份,表示两个指定日期时间之间的整月数。此方法可以核心地处理在间隔期间可能发生的任何夏令时变化。

答案 2 :(得分:1)

那里有一个简单的方法

import org.apache.spark.sql.functions
import spark.implicits._
val res=dataframe.withColumn("Month_Age",
functions.months_between(
  col("endDate"),
  col("startDate")
))

但是在此之前,如果日期字符串不是日期格式,则必须将其解析为日期格式

您可以通过以下方式检查架构

dataframe.printschema()

root  |-- endDate: date (nullable = false)  

      |-- startDate_date: date (nullable = true)

      |-- Month_Age: Long (nullable = true)

您可以使用

from_unixtime(col("Date")/1000).cast("date")

如果日期采用纪元格式。

如有任何疑问,请发表评论。