在 Scala 中比较一个日期是否大于等于另一个日期

问题描述 投票:0回答:5

场景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

scala java-time
5个回答
8
投票

使用“或”。据我所知,API 中没有方法可以在单个操作中完成此操作

date1.isAfter(date2) || date1.isEqual(date2)

另一种选择:

date1.compareTo(date2)  >=0 

4
投票

import scala.math.Ordering.Implicits._
之后,你可以直接写
date1 >= date2
(你可能需要
(date1: ChronoLocalDate) >= (date2: ChronoLocalDate)
,因为
LocalDate
实现了
Comparable<ChronoLocalDate>
而不是
Comparable<LocalDate>
,目前无法检查)。


2
投票

启用

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

2
投票

我最喜欢的处理 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

希望您会发现它很有用。

这是与此相关的我的博客文章


0
投票

我想出的通过单一操作解决类似情况的解决方案是:

  1. 交换值并 2.否定结果

场景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)
© www.soinside.com 2019 - 2024. All rights reserved.