лучший способ определить даты квартала - PullRequest
3 голосов
/ 14 июня 2019

У меня есть этот код, который работает:

    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

Как уже говорилось, это работает, но я не доволен кодом и пытался сделать это лучше. Есть ли лучший способ добиться этого?

Спасибо

Ответы [ 2 ]

3 голосов
/ 16 июня 2019

Класс java.time IsoFields может быть немного упущен.Это наш друг, когда дело доходит до манипулирования кварталами.Извините, что я могу писать только код 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]

Совет: используйте полуоткрытые интервалы.Хотя пользователи обычно предпочитают, чтобы период в календаре указывался как первый и последний день, в компьютерной программе обычно удобнее представлять период в виде с дата включительно и до дата эксклюзив .Итак, квартал как первый день квартала и первый день следующего квартала.И если вы уже знаете, что период составляет четверть, то только первый день квартала и ничего более.Остальное можно легко рассчитать по мере необходимости.

1 голос
/ 17 июня 2019

Quarter & YearQuarter

Добавьте библиотеку ThreeTen-Extra в ваш проект. Вы можете получить доступ к удобным классам, которые расширяют возможности современных java.time классов, встроенных в Java и определенных в JSR 310.

Класс enum Quarter представляет общие кварталы без года. Используйте этот класс в своем коде, а не просто целое число 1-4. Звук делает ваш код более самодокументируемым, обеспечивает безопасность типов и обеспечивает допустимые значения.

Quarter q = Quarter.Q2 ;

YearQuarter представляет квартал в конкретном году.

YearQuarter yq = YearQuarter.of( 2019 , q ) ;

Получить дату первого дня этого квартала.

LocalDate start = yq.atDay( 1 ) ;

Получить дату последнего дня квартала.

LocalDate lastDate = yq.atEndOfQuarter() ;

Или для полуоткрытых диапазонов дат получите первый день следующего квартала.

LocalDate stop = yq.plusQuarters( 1L ).atDay( 1 ) ;

Вместо того, чтобы возвращать простой массив дат, используйте класс LocalDateRange, также включенный в ThreeTen-Extra . Этот класс предлагает мощные методы сравнения, такие как содержит, прилегает, перекрывается и многое другое.

LocalDateRange qDates = LocalDateRange.of( start , stop ) ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...