Я работаю над проектом. Там я должен найти общее количество недель в году. Я попытался с помощью следующего кода, но я получил неправильный ответ: 2020 год имеет 53 недели, но этот код дает 52 недели.
Где я ошибся в этом коде?
package com.hib.mapping;
import java.time.LocalDate;
import java.time.temporal.WeekFields;
import java.util.Calendar;
import java.util.GregorianCalendar;
import org.joda.time.DateTime;
public class TestWeek {
public static void main(String args[]) {
System.out.println(getWeeks());
}
public static int getWeeks() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2020);
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 1);
GregorianCalendar gregorianCalendar = new GregorianCalendar();
int weekDay = cal.get(Calendar.DAY_OF_WEEK) - 1;
if (gregorianCalendar.isLeapYear(2020)) {
if (weekDay == Calendar.THURSDAY || weekDay == Calendar.WEDNESDAY)
return 53;
else
return 52;
} else {
if (weekDay == Calendar.THURSDAY)
return 53;
else
return 52;
}
}
}
Вывод:
52
java
date
java-8
week-number
Кумаресан Перумал
источник
источник
Date
и времени вокругCalendar
. Используйтеjava.time
вместо этого, это намного лучше и проще.Ответы:
Используя определение Википедии здесь . Год имеет 53 недели, если 1 января - четверг, или 31 декабря - четверг, в противном случае - 52 недели. Это определение эквивалентно тому, которое вы использовали. Я думаю, что это гораздо проще проверить, так как вам не нужно проверять високосные годы.
Используя
java.time
API Java 8 :источник
ТЛ; др
Для стандартной недели ISO 8601 используйте
YearWeek
класс из библиотеки ThreeTen-Extra с троичным оператором.Это,
YearWeek.of( 2020 , 1 ).is53WeekYear() ? 53 : 52
Определите «неделю»
Вам нужно определить неделю. В вашем примере кода определение недели зависит от текущего значения по умолчанию для JVM
Locale
. Так что ваши результаты могут отличаться во время выполнения.Ваш код также использует ужасные классы даты и времени, которые были вытеснены годами назад современными классами java.time . Прекратить использование
GregorianCalendar
&Calendar
; они были заменены по уважительным причинам.ISO 8601 неделя
ISO 8601 стандарт определяет неделю как:
Это определение означает:
Если ваше определение отличается, см. Ответ Ole VV .
YearWeek:is53WeekYear
Если это соответствует вашему определению, добавьте библиотеку ThreeTen-Extra в свой проект, чтобы расширить функциональность java.time, встроенную в Java 8 и более поздние версии . Затем у вас есть доступ к
YearWeek
классу.Чтобы спросить о конкретном недельном году, просто произвольно выберите любую неделю года. Например, для основанного на неделе года 2020 мы просим неделю # 1.
Обратите внимание на то, как первый день недели 2020 года начинается с календарного 2019 года.
источник
now
. Поскольку вы хотите получить количество недель для определенного года, а не для текущего года, просто используйтеYearWeek.of(yourYear, 1)
.Asia/Kolkata
, в настоящее время со смещением +05: 30. В Java - код:ZoneId.of( "Asia/Kolkata" )
. Для получения дополнительной информации и истории, см. Википедия, Время в Индии .Гибкое решение
Это должно работать для любой недельной схемы нумерации, которая может быть представлена в
WeekFields
объекте.Идея состоит в том, чтобы найти номер недели последней недели в году. Я пробую сначала с 31 декабря, но это может быть в первую неделю следующего года. Если так, я иду неделю назад.
Я довольно тщательно протестировал
WeekFields.ISO
, не так много с другимиWeekFields
объектами, но, как я уже сказал, я считаю, что это работает.Если вы точно знаете, что вам всегда понадобится ISO 8601 неделя, я думаю, вам следует воспользоваться одним из хороших ответов Sweeper и Basil Bourque . Я разместил это на тот случай, если вам нужно более гибкое решение, которое будет работать и с другими схемами нумерации на неделю.
Используйте java.time
Код в вашем вопросе забавен тем, что он импортирует классы как из Joda-Time, так и из java.time, но использует старый
Calendar
иGregorianCalendar
из Java 1.1. Эти классы были плохо спроектированы и сейчас давно устарели, не стоит их использовать. Joda-Time находится в режиме обслуживания, java.time вступил во владение после этого. Что я использую и рекомендую вам использовать.источник
Я думаю, что это должно работать так же хорошо:
источник
После много попыток в Java 8. Я не мог найти решение. Затем я подготовил Йоду дату и время зависимости. Это дало мне хороший ответ, как я и ожидал
код:
Зависимость Maven:
источник