以其他方式实施else-if scala语句

问题描述 投票:1回答:2

我在Scala中使用一个函数,该函数获取开始日期,到期日期和时区信息作为参数。该函数必须返回四分之一标签,如下所示:

2020年第二季度

可能发生不同的情况:

  • 到期日期为空,从开始日期开始计算季度标签
  • 到期日期从9999年开始,从开始日期开始计算季度标签
  • 开始日期为空,从到期日开始计算季度标签
  • 当开始日期和截止日期都可用时,它们应该是相同的,请返回该季度标签
  • 时区信息可以为空,或者两个日期都可以为空,在这些情况下不执行任何操作

我开始实现-暂时忽略某些要求]-,最后得到了百万个if语句,它们甚至都没有按照我想要的方式工作。

当开始日期和到期日期均可用时,它将计算季度和所有内容,以及时区信息。当时区不可用(正确)时,它将跳过,但是在缺少开始日期或到期日期时,它将不起作用。

代码:

import java.time.{LocalDateTime,ZoneId}
import java.time.format.DateTimeFormatter
import java.time.temporal.ChronoUnit._
import java.time.temporal.IsoFields

object someObject extends Serializable {

  def isEmpty(x: String): Boolean = x == null || Option(x.trim).forall(_.isEmpty)

  def quarterlyFilter(startDate: String, dueDate: String, timeZone: String): String = {

      val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
      val calculatorTZ = ZoneId.of("GMT+4")

    try {
          if(isEmpty(dueDate) == true || dueDate.startsWith("9999")) {
              val start = LocalDateTime.parse(startDate, formatter)
              val incomingTZ = ZoneId.of(timeZone)
              val incomingStart = start.atZone(incomingTZ)

              val calculatedStartDate = incomingStart.withZoneSameInstant(calculatorTZ).toLocalDate

              val quarter = calculatedStartDate.get(IsoFields.QUARTER_OF_YEAR)
              val year = calculatedStartDate.getYear
            println("only start")
              year + " " + quarter

          } else if(isEmpty(startDate) == true) {
            val due = LocalDateTime.parse(dueDate, formatter)

            val incomingTZ = ZoneId.of(timeZone)
            val incomingDue = due.atZone(incomingTZ)

            val calculatedDueDate = incomingDue.withZoneSameInstant(calculatorTZ).toLocalDate

            val quarter = calculatedDueDate.get(IsoFields.QUARTER_OF_YEAR)
            val year = calculatedDueDate.getYear
            println("only due")

            year + " " + quarter
          } else {
            val start = LocalDateTime.parse(startDate, formatter)
            val due = LocalDateTime.parse(dueDate, formatter)

            val incomingTZ = ZoneId.of(timeZone)
            val incomingStart = start.atZone(incomingTZ)
            val incomingDue = due.atZone(incomingTZ)

            val calculatedStartDate = incomingStart.withZoneSameInstant(calculatorTZ).toLocalDate
            val calculatedDueDate = incomingDue.withZoneSameInstant(calculatorTZ).toLocalDate

            val startQuarter = calculatedStartDate.get(IsoFields.QUARTER_OF_YEAR)
            val startYear = calculatedStartDate.getYear
            val dueQuarter = calculatedDueDate.get(IsoFields.QUARTER_OF_YEAR)
            val dueYear = calculatedDueDate.getYear
            println("both")
            startYear + " " + startQuarter + " vs " + dueYear + " " + dueQuarter
          }
      } catch {
            case e: java.time.zone.ZoneRulesException => {
              println("no timeZone info")
              null
            }
          }
       }
  def checkQuarter: (String,String,String) => String = quarterlyFilter
  val getQuarterInfo = udf(checkQuarter)

}

当我使用以下测试数据运行此命令时:

val startDate = "null"
val currentDate = "2018-09-30 21:59:59"
val timeZone = "Europe/Copenhagen"

someObject.quarterlyFilter(startDate, currentDate, timeZone)

我收到此错误,即使甚至不应该进行解析。。

java.time.format.DateTimeParseException

您能帮我使此功能更好,更简单吗?预先感谢!

我在Scala中使用一个函数,该函数获取开始日期,截止日期和时区信息作为参数。该函数必须返回四分之一标签,如下所示:2020 Q2 There ...

scala if-statement datetime-parsing
2个回答
3
投票

[好,让我们看看我们可以做什么。

首先要防止空的timeZone,因为这很容易造成短路,我们很高兴知道以后有一个有效的C0。这里有两个选择;您可以使用条件return None(Java风格),也可以将方法的其余部分包装在flatMap中(这是我的偏爱)。我们还将在此处检查ZoneRulesException位,并将无效的时区视为“无时区”(可以说是):


2
投票

如果我正确理解了需求,我会这样做:

© www.soinside.com 2019 - 2024. All rights reserved.