我有这个有效的代码:
private fun getCycleBoundaries(cycleNumber: Int, year: Int): Array<Date> {
return when (cycleNumber) {
1 -> arrayOf(DATE_FORMATER.parse("$year-01-01T00:00:00"), DATE_FORMATER.parse("$year-03-31T23:59:59"))
2 -> arrayOf(DATE_FORMATER.parse("$year-04-01T00:00:00"), DATE_FORMATER.parse("$year-06-30T23:59:59"))
3 -> arrayOf(DATE_FORMATER.parse("$year-07-01T00:00:00"), DATE_FORMATER.parse("$year-09-30T23:59:59"))
4 -> arrayOf(DATE_FORMATER.parse("$year-10-01T00:00:00"), DATE_FORMATER.parse("$year-12-31T23:59:59"))
else -> throw IllegalArgumentException("$cycleNumber is nor a valid cycle number")
}
}
此代码采用循环编号:1 或 2 或 3 或 4 和一年 它返回 2 个日期的数组(季度的开始和结束)
例如,如果我调用:
getCycleBoundaries(1, 2019)
我预计:
2019-01-01T00:00:00 and 2019-03-31T23:59:59
如前所述,它有效,但我对代码不满意,并试图做得更好。 有没有更好的方法来实现这一目标?
谢谢
最佳答案
java.time 的IsoFields
类可能有点被忽略了。在操纵宿舍方面,它是我们的 friend 。抱歉,我只会写 Java 代码。
public static LocalDate[] getCycleBoundaries(int cycleNumber, int year) {
YearMonth firstMonthOfQuarter = YearMonth.of(year, 1)
.with(IsoFields.QUARTER_OF_YEAR, cycleNumber);
return new LocalDate[] { firstMonthOfQuarter.atDay(1),
firstMonthOfQuarter.plusMonths(2).atEndOfMonth() };
}
让我们试试看:
System.out.println(Arrays.toString(getCycleBoundaries(4, 2019)));
这种情况下的输出:
[2019-10-01, 2019-12-31]
提示:使用半开区间。虽然用户通常更喜欢在日历中将时间段指定为第一天和最后一天,但在计算机程序中,将时间段表示为从日期包含和到日期独家。所以一个季度作为该季度的第一天和下一个季度的第一天。如果您已经知道该期间是一个季度,那么只是该季度的第一天,仅此而已。其余的可以根据需要轻松计算。
关于java - 确定季度边界日期的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56595120/