Scala 中给定日期的当前和上一季度的第一个和最后一个日期
First and Last Date of Current and Previous Quarter For a Given Date in Scala
我正在写一个每月自动执行一次的代码,它将计算机上的日期作为执行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
中的日期需要转换为
的首尾日期
- 上个月
today
- 当前和上一季度
today
我能够完成 Data
函数中显示的第一个。
假设今天得到以下日期 - 2022-01-27T14:25:26.374+05:30
上面的函数returns
Last Month Start Date: 2021-12-01
Last Month End Date: 2021-12-31
我如何才能实现第二个 - 当前和上一季度的第一个和最后一个日期?
Ex - 今天得到以下日期 - 2022-01-27T14:25:26.374+05:30
我需要 return 2021-10-01
和 2021-12-31
上一季度
以及当前季度的 2022-01-01
和 2022-03-31
。
某些解决方案建议使用 Spark SQL 和 Dataframes,但这不适用于这种情况。
是否有像在月份案例中那样直接执行此操作的方法?或者 udf 是这里唯一的选择吗?
以下可以做到。如果必须将它应用于 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
我正在写一个每月自动执行一次的代码,它将计算机上的日期作为执行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
中的日期需要转换为
- 上个月
today
- 当前和上一季度
today
我能够完成 Data
函数中显示的第一个。
假设今天得到以下日期 - 2022-01-27T14:25:26.374+05:30
上面的函数returns
Last Month Start Date: 2021-12-01
Last Month End Date: 2021-12-31
我如何才能实现第二个 - 当前和上一季度的第一个和最后一个日期?
Ex - 今天得到以下日期 - 2022-01-27T14:25:26.374+05:30
我需要 return 2021-10-01
和 2021-12-31
上一季度
以及当前季度的 2022-01-01
和 2022-03-31
。
某些解决方案建议使用 Spark SQL 和 Dataframes,但这不适用于这种情况。
是否有像在月份案例中那样直接执行此操作的方法?或者 udf 是这里唯一的选择吗?
以下可以做到。如果必须将它应用于 DF
中的每一行,则这可能是一个 UDFimport 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