Как мне узнать четверть данной даты? - PullRequest
29 голосов
/ 19 ноября 2008

Учитывая объект java.util.Date, как мне узнать, в каком квартале он находится?

Предполагая, что Q1 = январь февраль март, Q2 = апрель, май, июнь и т. Д.

Ответы [ 13 ]

47 голосов
/ 19 ноября 2008

Вы можете использовать

int quarter = (myDate.getMonth() / 3) + 1;

Имейте в виду, что getMonth устарело:

Начиная с версии 1.1 JDK, заменено на Calendar.get (Calendar.MONTH).

27 голосов
/ 21 апреля 2016

В Java 8 и более поздних версиях классы java.time имеют более простую версию. Используйте LocalDate и IsoFields

LocalDate.now().get(IsoFields.QUARTER_OF_YEAR)
12 голосов
/ 19 ноября 2008

Вам придется написать свой собственный код, потому что термин «квартал» различен для каждого бизнеса. Разве вы не можете просто сделать что-то вроде:

Calendar c = /* get from somewhere */
int month = c.get(Calendar.MONTH);

return (month >= Calendar.JANUARY && month <= Calendar.MARCH)     ? "Q1" :
       (month >= Calendar.APRIL && month <= Calendar.JUNE)        ? "Q2" :
       (month >= Calendar.JULY && month <= Calendar.SEPTEMBER)    ? "Q3" :
                                                                    "Q4";
10 голосов
/ 19 ноября 2008

Поскольку кварталы - это локализованная (западная) концепция, вместо локали по умолчанию укажите локаль:

Calendar cal = Calendar.getInstance(Locale.US);
/* Consider whether you need to set the calendar's timezone. */
cal.setTime(date);
int month = cal.get(Calendar.MONTH); /* 0 through 11 */
int quarter = (month / 3) + 1;

Это позволит избежать получения тринадцатого месяца (Calendar.UNDECIMBER) для незападных календарей и перекоса, вызванного их более короткими месяцами.

4 голосов
/ 26 июня 2013

Если у вас есть

private static final int[] quarters = {1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4};

Тогда ток quarter равен

private static final int thisQuarter = quarters[thisMonth];

Где thisMonth равно

private static final int thisMonth = cal.get(Calendar.MONTH);
3 голосов
/ 18 августа 2016

При использовании времени Joda используйте функцию Math.ceil ():

double quarter = Math.ceil(new Double(jodaDate.getMonthOfYear()) / 3.0);
2 голосов
/ 24 апреля 2015

Убедитесь, что thisMonth - это хотя бы число с плавающей запятой или двойное число, а не целое число:

String quarter = thisMonth/3 <= 1 ? "Q1" : thisMonth/3 <= 2 ? "Q2" : thisMonth/3 <= 3 ? "Q3" : "Q4";

С уважением, MS

1 голос
/ 02 сентября 2016

ТЛ; др

YearQuarter
.from(
    LocalDate.of( 2018 , 1 , 23 ) 
)

ThreeTen-Extra

Правильный ответ от abdmob : использование java.time - разумный путь.

Кроме того, проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time.

Его полезные классы включают в себя:

Текущий квартал

Чтобы узнать текущий квартал, укажите часовой пояс. Определение квартала означает определение даты. А определение даты означает указание часового пояса. В любой момент времени дата меняется по всему земному шару в зависимости от зоны. Укажите с помощью правильное имя часового пояса в форме continent/region. Никогда не используйте 3-4 буквенные сокращения, такие как EST или IST.

ZoneId z = ZoneId.of( "America/Montreal" );
YearQuarter yq = YearQuarter.now( z );

Учитывая java.util.Date

Если дано java.util.Date, сначала преобразовать в тип java.time. Класс Instant представляет момент на временной шкале в UTC с разрешением наносекунд .

Instant instant = myUtilDate.toInstant();

Назначьте часовой пояс, чтобы получить ZoneDateTime.

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

Создайте YearQuarter из этого ZonedDateTime.

YearQuarter yq = YearQuarter.from( zdt );

Используйте по всему коду

Вы должны передавать экземпляры YearQuarter, а не просто числа или строки. Использование объектов обеспечивает безопасность типов, гарантирует допустимые значения и делает ваш код более самодокументируемым.

1 голос
/ 12 июля 2014
int month = Calendar.getInstance().get( Calendar.MONTH ) + 1;

int quarter = month % 3 == 0?  (month / 3): ( month / 3)+1;
1 голос
/ 19 ноября 2008

Хорошие решения здесь, но помните, что кварталы могут меняться в зависимости от компании / отрасли. Иногда квартал может отличаться от трех месяцев.

Вы, вероятно, хотите расширить или инкапсулировать класс календаря, чтобы настроить его для своих задач, а не написать какую-либо служебную функцию, которая преобразует его. Ваше приложение, вероятно, достаточно сложное в этой области, чтобы вы могли найти другие применения для своего нового класса календаря - я обещаю, что вы будете рады, что вы расширили или инкапсулировали его, даже если сейчас это выглядит глупо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...