我在Scala中使用一个函数,该函数获取开始日期,到期日期和时区信息作为参数。该函数必须返回四分之一标签,如下所示:
2020年第二季度
可能发生不同的情况:
我开始实现-暂时忽略某些要求]-,最后得到了百万个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 ...
[好,让我们看看我们可以做什么。
首先要防止空的timeZone
,因为这很容易造成短路,我们很高兴知道以后有一个有效的C0。这里有两个选择;您可以使用条件return None
(Java风格),也可以将方法的其余部分包装在flatMap中(这是我的偏爱)。我们还将在此处检查ZoneRulesException
位,并将无效的时区视为“无时区”(可以说是):
如果我正确理解了需求,我会这样做: