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;
}
Как тип Элементом
blockquote >.rest
является<p>
, поэтому здесьnth-of-type
обнаруживает тип.rest
, а затем он накладывает css на 1-й, 2-й, 3-й, 4-й, 5-й элементы<p>
.
Вы можете использовать
int quarter = (myDate.getMonth() / 3) + 1;
. Будьте предупреждены, хотя getMonth устарело:
Начиная с версии 1.1 JDK, заменено на Calendar.get (Calendar.MONTH).
В Java 8 и более поздних версиях классы java.time имеют более простую версию. Используйте LocalDate
и IsoFields
LocalDate.now().get(IsoFields.QUARTER_OF_YEAR)
int month = Calendar.getInstance().get( Calendar.MONTH ) + 1;
int quarter = month % 3 == 0? (month / 3): ( month / 3)+1;
Поскольку кварталы представляют собой локализованную (западную) концепцию, вместо локали по умолчанию укажите локаль:
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) в незападных календарях, и любой перекос, вызванный их более короткими месяцами.
Вам придется написать свой собственный код, потому что термин «квартал» различен для каждого бизнеса. Разве вы не можете просто сделать что-то вроде:
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";
с 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
При использовании времени Joda используйте функцию Math.ceil ():
double quarter = Math.ceil(new Double(jodaDate.getMonthOfYear()) / 3.0);
У JFreeChart есть класс Quarter. Если вам интересно, посмотрите javadoc . Источник также доступен в SourceForge , если вы хотите проверить реализацию.
Удостоверьтесь, что thisMonth
является по крайней мере плавающей или двойной, а не целым числом:
String quarter = thisMonth/3 <= 1 ? "Q1" : thisMonth/3 <= 2 ? "Q2" : thisMonth/3 <= 3 ? "Q3" : "Q4";
С уважением, MS
Если у вас есть
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);
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
, а не просто числа или строки. Использование объектов обеспечивает безопасность типов, гарантирует допустимые значения и делает ваш код более самодокументируемым.
Хорошие решения здесь, но помните, что кварталы могут меняться в зависимости от компании / отрасли. Иногда квартал может отличаться от трех месяцев.
Вы, вероятно, хотите расширить или инкапсулировать класс календаря, чтобы настроить его для своих задач, а не написать какую-нибудь служебную функцию, которая преобразует его. Ваше приложение, вероятно, достаточно сложное в этой области, чтобы вы могли найти другие применения для своего нового календарного класса - я обещаю, что вы будете рады, что вы расширили или инкапсулировали его, даже если сейчас это кажется глупым.
Для меня, я использовал этот метод для представления строки:
int quarter = (Calendar.getInstance().get(Calendar.MONTH) / 3); // 0 to 3
String[] mQuarterKey = {"qt1", "qt2", "qt3", "qt4"};
String strQuarter = mQuarterKey[quarter];
Я использую этот метод.
public static Integer getQuarter(Date d){
Calendar c = Calendar.getInstance();
c.setTime(d);
int month = c.get(Calendar.MONTH);
return (month /3)+1;
}