java - 确定季度边界日期的更好方法

标签 java date kotlin

我有这个有效的代码:

    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/

相关文章:

java - 监听 JTable 单元格值的变化并相应地更新数据库的最佳方法是什么?

javascript - Websocket.onmessage 没有触发

javascript - 为什么 IE 和 FF 不会为输入类型日期返回正确的属性或类型

多个文档之间的MongoDB dateDiff

android - 将毫秒字符串转换为日期字符串

Kotlin lambda 语法混淆

java - 检查方法是否对 permgen 内存有贡献

android - 我的anko-sqlite数据库对象无法调用

java - 如何仅将对象传递到决策表的ACTION部分?

java - Apache poi excel 文件在关闭前抛出确认