场景1
val date1 = LocalDate.parse("2017-02-07")
val date2 = LocalDate.parse("2017-02-01")
date1.isAfter(date2)
输出
true
场景2
val date1 = LocalDate.parse("2017-02-07")
val date2 = LocalDate.parse("2017-02-07")
date1.isAfter(date2)
输出
false
我想在日期 >=
true
时返回 2017-02-07
。
使用“或”。据我所知,API 中没有方法可以在单个操作中完成此操作
date1.isAfter(date2) || date1.isEqual(date2)
另一种选择:
date1.compareTo(date2) >=0
import scala.math.Ordering.Implicits._
之后,你可以直接写date1 >= date2
(你可能需要(date1: ChronoLocalDate) >= (date2: ChronoLocalDate)
,因为LocalDate
实现了Comparable<ChronoLocalDate>
而不是Comparable<LocalDate>
,目前无法检查)。
启用
LocalDate
排序的另一种方法是利用隐式转换为 Long
(通过 toEpochDay()
),它具有明确定义的排序:
import java.time.LocalDate
val date1 = LocalDate.parse("2017-02-07")
val date2 = LocalDate.parse("2017-02-07")
import scala.math.Ordering.Implicits._
implicit def localDateOrderer: Ordering[LocalDate] = Ordering.by(d => d.toEpochDay)
date1 >= date2
// res1: Boolean = true
我最喜欢的处理 LocalDate 比较的方法之一是使用
implicit class
。你可以认为 implicit class
就像 C# 中的扩展方法一样。
您可以如下定义隐式类:
import org.joda.time.{Days, LocalDate}
object LocalDateExtension {
class LocalDateExtension(a: LocalDate) {
def dayDiff(b: LocalDate): Int = {
Days.daysBetween(a, b).getDays.abs
}
def >(b: LocalDate): Boolean = {
a.isAfter(b)
}
def >=(b: LocalDate): Boolean = {
a.isAfter(b) || a.isEqual(b)
}
def <(b: LocalDate): Boolean = {
a.isBefore(b)
}
def <=(b: LocalDate): Boolean = {
a.isBefore(b) || a.isEqual(b)
}
}
implicit def extendLocalDate(a: LocalDate) = new LocalDateExtension(a)
}
然后你可以像这样使用扩展:
val a = LocalDate("2010-04-29")
val b = LocalDate("2010-04-29")
print(a > b) // false
print(a >= b) // true
print(a < b) // false
print(a <= b) // true
希望您会发现它很有用。
这是与此相关的我的博客文章。
我想出的通过单一操作解决类似情况的解决方案是:
场景2
val date1 = LocalDate.parse("2017-02-07")
val date2 = LocalDate.parse("2017-02-07")
!date2.isAfter(date1) // equiv. date1.isAfter(date2) || date1.isEqual(date2)