【问题标题】:First and Last Date of Current and Previous Quarter For a Given Date in ScalaScala中给定日期的当前和上一季度的第一个和最后一个日期
【发布时间】:2022-01-27 09:09:47
【问题描述】:

我正在编写一个每月自动执行一次的代码,它将计算机中的日期作为执行while循环的开始和结束日期。

 val today = new DateTime().withZone(DateTimeZone.forID("Asia/Kolkata"))
 var start =  today.toString(DateTimeFormat.forPattern("yyyy-MM-dd"))
 val end = today.toString(DateTimeFormat.forPattern("yyyy-MM-dd"))

 while(start<=end){
    Data(start,end)
 }

def Data (start: DateTime, end: DateTime) {

    val start_temp = start
    val end_temp = end
    var start_temp_1 = start_temp.minusMonths(1).withDayOfMonth(1);
    var start_date_monthly = start_temp_1.toString(DateTimeFormat.forPattern("yyyy-MM-dd"))
    println("Last Month Start Date: " + start_date_monthly)
    var end_temp_1 = end_temp.minusMonths(0).withDayOfMonth(1);
    var end_temp_2 = end_temp_1.minusDays(1)
    var end_date_monthly = end_temp_2.toString(DateTimeFormat.forPattern("yyyy-MM-dd"))
    println("Last Month End Date: " + end_date_monthly)
    
}

变量today中的日期需要转换为的第一个和最后一个日期

  1. 上个月来自today
  2. 当前和上一季度来自today

我能够完成Data 函数中显示的第一个。

假设今天得到以下日期 - 2022-01-27T14:25:26.374+05:30 上述函数返回

Last Month Start Date: 2021-12-01
Last Month End Date: 2021-12-31

我怎样才能为第二个 - 当前和上一季度的第一个和最后一个日期实现这一目标?

Ex - 今天得到以下日期 - 2022-01-27T14:25:26.374+05:30 我需要返回上一季度的2021-10-012021-12-31 以及当前季度的2022-01-012022-03-31

某些解决方案建议使用 Spark SQL 和 Dataframes,但这不适用于这种情况。

有没有一种直接的方式来做到这一点,就像在月份案例中所做的那样?还是 udf 是这里唯一的选择?

【问题讨论】:

  • 这是否适用于您在数据框中记录的每个日期行
  • 不,没有数据框。基本上,月份和季度的开始日期和结束日期将用作将执行的排序查询中的过滤器。由于目标是自动化,因此需要使用某种函数转换日期。

标签: scala date datetime


【解决方案1】:

以下可以做到。如果必须将其应用于 DF 中的每一行,这可能是一个 UDF

import java.time.temporal.IsoFields
import java.time.temporal.IsoFields.QUARTER_OF_YEAR
import java.time.{LocalDate, YearMonth}

def printQuarterBeginAndEnd(localDate: LocalDate): Unit = {
  val currentQuarter = localDate.get(QUARTER_OF_YEAR)
  val currentYear = localDate.getYear
  val currentMonth = localDate.getMonth
  val startOfQuarter = YearMonth.of(currentYear, (currentQuarter-1) * 3 + 1).`with`(QUARTER_OF_YEAR, currentQuarter).atDay(1)
  val endOfQuarter = YearMonth.of(currentYear, currentQuarter * 3).`with`(QUARTER_OF_YEAR, currentQuarter).atEndOfMonth()
  println(s"Start $startOfQuarter ends $endOfQuarter")
}

printQuarterBeginAndEnd(LocalDate.now())
printQuarterBeginAndEnd(LocalDate.now().minus(1, IsoFields.QUARTER_YEARS))

打印以下内容

import java.time.temporal.IsoFields
import java.time.temporal.IsoFields.QUARTER_OF_YEAR
import java.time.{LocalDate, YearMonth}

printQuarterBeginAndEnd: (localDate: java.time.LocalDate)Unit



Start 2022-01-01 ends 2022-03-31
Start 2021-10-01 ends 2021-12-31

scala> printQuarterBeginAndEnd(LocalDate.now().minus(1, IsoFields.QUARTER_YEARS)) Start 2021-10-01 ends 2021-12-31

scala> printQuarterBeginAndEnd(LocalDate.now()) Start 2022-01-01 ends 2022-03-31

scala> printQuarterBeginAndEnd(LocalDate.parse("2021-01-01")) Start 2021-01-01 ends 2021-03-31

【讨论】:

  • 逻辑似乎有问题。今天是 2 月 1 日,返回当前和上一季度开始的错误开始日期。
  • @PixieDev 忽略了一些东西,做了一个快速修复并在 CLI 上进行了测试。如果可行,值得一看
  • 是的,现在正在工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多