Учитывая объект java.util.Date, как мне найти, в чем заключается его Квартал?
Предполагая, что Q1 = январь февраль, Q2 = апрель, май, июнь и т.д.
Учитывая объект java.util.Date, как мне найти, в чем заключается его Квартал?
Предполагая, что Q1 = январь февраль, Q2 = апрель, май, июнь и т.д.
Вы можете использовать
int quarter = (myDate.getMonth() / 3) + 1;
Будьте осторожны, хотя getMonth устарел:
По версии JDK версии 1.1, заменен на Calendar.get(Calendar.MONTH).
В Java 8 и более поздних версиях классы java.time имеют более простую версию. Используйте LocalDate
и IsoFields
LocalDate.now().get(IsoFields.QUARTER_OF_YEAR)
Вам придется писать свой собственный код, потому что термин "Квартал" отличается для каждого бизнеса. Не можете ли вы просто сделать что-то вроде:
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";
Поскольку четверти представляют собой локализованную (западную) концепцию, укажите локаль, а не использовать платформу по умолчанию:
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) на незападных календарях и любого перекоса, вызванного их более короткими месяцами.
Если у вас
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);
При использовании времени Joda используйте функцию Math.ceil():
double quarter = Math.ceil(new Double(jodaDate.getMonthOfYear()) / 3.0);
Убедитесь, что thisMonth
- это по крайней мере float или double, а не int:
String quarter = thisMonth/3 <= 1 ? "Q1" : thisMonth/3 <= 2 ? "Q2" : thisMonth/3 <= 3 ? "Q3" : "Q4";
С уважением, МС
YearQuarter
.from(
LocalDate.of( 2018 , 1 , 23 )
)
Ответ от 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 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
и & SimpleDateFormat
.
Чтобы узнать больше, см. Учебное пособие по Oracle. И поищите в Кару множество примеров и объяснений. Спецификация: JSR 310.
Проект Joda-Time, который теперь находится в режиме обслуживания, рекомендует выполнить переход на классы java.time.
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или более поздней версией. Нет необходимости в строках, нет необходимости в классах java.sql.*
.
Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и еще more.
JFreeChart имеет класс Quarter. Если вам интересно, посмотрите javadoc. Источник также доступен из SourceForge, если вы хотите проверить реализацию.
Хорошие решения здесь, но помните, что кварталы могут быть изменены в зависимости от компании и отрасли. Иногда четверть может быть разным 3 месяца.
Вероятно, вы хотите расширить или инкапсулировать класс календаря, чтобы настроить его на свои задачи, а не писать какую-либо функцию-утилиту, которая преобразует ее. Ваше приложение, вероятно, достаточно сложное в этой области, что вы найдете другие возможности для своего нового класса календаря - я обещаю, что вы будете рады, что вы расширили или инкапсулировали его, даже если теперь это кажется глупым.
int month = Calendar.getInstance().get( Calendar.MONTH ) + 1;
int quarter = month % 3 == 0? (month / 3): ( month / 3)+1;
Для меня я использовал этот метод для строкового представления:
int quarter = (Calendar.getInstance().get(Calendar.MONTH) / 3); // 0 to 3
String[] mQuarterKey = {"qt1", "qt2", "qt3", "qt4"};
String strQuarter = mQuarterKey[quarter];
с помощью 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
Я использую этот метод.
public static Integer getQuarter(Date d){
Calendar c = Calendar.getInstance();
c.setTime(d);
int month = c.get(Calendar.MONTH);
return (month /3)+1;
}