Подтвердить что ты не робот

Как узнать Квартал данной даты?

Учитывая объект java.util.Date, как мне найти, в чем заключается его Квартал?

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

4b9b3361

Ответ 1

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

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

Будьте осторожны, хотя getMonth устарел:

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

Ответ 2

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

LocalDate.now().get(IsoFields.QUARTER_OF_YEAR)

Ответ 3

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

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";

Ответ 4

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

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

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

Ответ 5

Если у вас

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);

Ответ 6

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

double quarter = Math.ceil(new Double(jodaDate.getMonthOfYear()) / 3.0);

Ответ 7

Убедитесь, что thisMonth - это по крайней мере float или double, а не int:

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

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

Ответ 8

ТЛ; др

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, а не просто числа или строки. Использование объектов обеспечивает безопасность типов, гарантирует допустимые значения и делает ваш код более самодокументируемым.


О java.time

Среда java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar и & SimpleDateFormat.

Чтобы узнать больше, см. Учебное пособие по Oracle. И поищите в Кару множество примеров и объяснений. Спецификация: JSR 310.

Проект Joda-Time, который теперь находится в режиме обслуживания, рекомендует выполнить переход на классы java.time.

Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или более поздней версией. Нет необходимости в строках, нет необходимости в классах java.sql.*.

Где взять классы java.time?

  • Java SE 8, Java SE 9, Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с встроенной реализацией ,
    • Java 9 добавляет некоторые мелкие функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональности java.time перенесена на Java 6 & 7 в ThreeTen-Backport.
  • Android

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

Ответ 9

JFreeChart имеет класс Quarter. Если вам интересно, посмотрите javadoc. Источник также доступен из SourceForge, если вы хотите проверить реализацию.

Ответ 10

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

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

Ответ 11

int month = Calendar.getInstance().get( Calendar.MONTH ) + 1;

int quarter = month % 3 == 0?  (month / 3): ( month / 3)+1;

Ответ 12

Для меня я использовал этот метод для строкового представления:

int quarter = (Calendar.getInstance().get(Calendar.MONTH) / 3); // 0 to 3
String[] mQuarterKey = {"qt1", "qt2", "qt3", "qt4"};
String strQuarter = mQuarterKey[quarter];

Ответ 13

с помощью java8 вы можете использовать форматтер:

import java.time.format.DateTimeFormatter
import java.time.LocalDate

println("withQuarter: " + LocalDate.of("2016".toInt,"07".toInt,1).format(DateTimeFormatter.ofPattern("yyyyQMM")))

withQuarter: 2016 3 07

Ответ 14

Я использую этот метод.

 public static Integer getQuarter(Date d){
    Calendar c = Calendar.getInstance();
    c.setTime(d);
    int month = c.get(Calendar.MONTH);
    return (month /3)+1;
}