Как мне узнать четверть данной даты?

nth-of-type работает в соответствии с индексом того же типа элемента, но nth-child работает только в соответствии с индексом независимо от того, какой тип элементов сиблингов.

Например

<div class="one">...</div>
<div class="two">...</div>
<div class="three">...</div>
<div class="four">...</div>
<div class="five">...</div>
<div class="rest">...</div>
<div class="rest">...</div>
<div class="rest">...</div>
<div class="rest">...</div>
<div class="rest">...</div>

Предположим, что в выше html мы хотим скрыть все элементы, имеющие класс отдыха.

В этом случае nth-child и nth-of-type будут работать точно так же, как и все элементы одного типа, <div>, поэтому css должен быть

.rest:nth-child(6), .rest:nth-child(7), .rest:nth-child(8), .rest:nth-child(9), .rest:nth-child(10){
    display:none;
}

OR

.rest:nth-of-type(6), .rest:nth-of-type(7), .rest:nth-of-type(8), .rest:nth-of-type(9), .rest:nth-of-type(10){
    display:none;
}

Теперь вам должно быть интересно узнать, в чем разница между nth-child и nth-of-type, так что это разница

Предположим, что html is

<div class="one">...</div>
<div class="two">...</div>
<div class="three">...</div>
<div class="four">...</div>
<div class="five">...</div>
<p class="rest">...</p>
<p class="rest">...</p>
<p class="rest">...</p>
<p class="rest">...</p>
<p class="rest">...</p>

В приведенном выше html тип элемента .rest отличается от других .rest - это абзацы, а другие - div, поэтому в этом случае if вы используете nth-child, вы должны писать так

.rest:nth-child(6), .rest:nth-child(7), .rest:nth-child(8), .rest:nth-child(9), .rest:nth-child(10){
    display:none;
}

, но если вы используете nss-тип css, это может быть

.rest:nth-of-type(1), .rest:nth-of-type(2), .rest:nth-of-type(3), .rest:nth-of-type(4), .rest:nth-of-type(5){
    display:none;
}

Как тип Элементом .rest является <p>, поэтому здесь nth-of-type обнаруживает тип .rest, а затем он накладывает css на 1-й, 2-й, 3-й, 4-й, 5-й элементы <p>.

29
задан Allain Lalonde 19 November 2008 в 17:15
поделиться

14 ответов

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

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

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

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

47
ответ дан Bill the Lizard 19 November 2008 в 17:15
поделиться

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

LocalDate.now().get(IsoFields.QUARTER_OF_YEAR)
28
ответ дан bkissinger 19 November 2008 в 17:15
поделиться
int month = Calendar.getInstance().get( Calendar.MONTH ) + 1;

int quarter = month % 3 == 0?  (month / 3): ( month / 3)+1;
1
ответ дан slfan 19 November 2008 в 17:15
поделиться

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

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) в незападных календарях, и любой перекос, вызванный их более короткими месяцами.

10
ответ дан erickson 19 November 2008 в 17:15
поделиться

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

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";
12
ответ дан Outlaw Programmer 19 November 2008 в 17:15
поделиться

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

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

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

с кварталом: 2016 3 07

0
ответ дан nexoma 19 November 2008 в 17:15
поделиться

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

double quarter = Math.ceil(new Double(jodaDate.getMonthOfYear()) / 3.0);
3
ответ дан Coltini 19 November 2008 в 17:15
поделиться

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

1
ответ дан Brendan Cashman 19 November 2008 в 17:15
поделиться

Удостоверьтесь, что thisMonth является по крайней мере плавающей или двойной, а не целым числом:

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

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

2
ответ дан NathanOliver 19 November 2008 в 17:15
поделиться

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

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);
4
ответ дан JAM 19 November 2008 в 17:15
поделиться

tl; dr

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
ответ дан Basil Bourque 19 November 2008 в 17:15
поделиться

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

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

1
ответ дан Bill K 19 November 2008 в 17:15
поделиться

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

int quarter = (Calendar.getInstance().get(Calendar.MONTH) / 3); // 0 to 3
String[] mQuarterKey = {"qt1", "qt2", "qt3", "qt4"};
String strQuarter = mQuarterKey[quarter];
0
ответ дан Keiichi 19 November 2008 в 17:15
поделиться

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

 public static Integer getQuarter(Date d){
    Calendar c = Calendar.getInstance();
    c.setTime(d);
    int month = c.get(Calendar.MONTH);
    return (month /3)+1;
}
0
ответ дан 27 November 2019 в 19:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: