2016-01-11 8 views
4

Я знаю, что Calendar.WEEK_OF_YEAR может быть использован для получения «недели года» на определенную дату, но как мне получить соответствующий YEAR ?.Как получить ГОД за неделю года для даты?

Я знаю, что определение Week of Year is dependent на Locale. И меня в основном интересует решение DIN 1355-1// German (но я не хочу, чтобы это было исправление).

Так что может случиться так, что 1 января принадлежит:

  • первая неделя года (1) нового года: например, 2015-01-01 в неделю на 1 год 2015
  • последняя неделя года (53) года, прежде чем, например 2016-01-01 в неделю 53 года год

Мой вопрос заключается в том, чтобы получить в этом году *

?
Date date = 
Calender calendar = new GregorianCalendar(Locale.GERMAN) 
calendar.setTime(date); 

int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR); 
int year  = ????            <------------ 

System.out.println(date + " is in " + weekOfYear + " of " + year); 

* решение не является: date.getYear, date.getFirstDayOfWeek.getYear или date.getLastDayOfWeek.getYear

ответ

2

calendar.getWeekYear(); возвращает 2015 для данного примера.

См. Документацию по API для GregorianCalendar#getWeekYear(), а также week year.

Для справки

Calendar calendar = new GregorianCalendar(Locale.GERMAN); 
calendar.set(2016, Calendar.JANUARY, 1, 0, 0, 0); 
Date date = calendar.getTime(); 

int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR); 
int year  = calendar.getWeekYear(); 

System.out.println(date + " is in " + weekOfYear + " of " + year); 

возвращает

Fri Jan 01 00:00:00 CET 2016 is in 53 of 2015 
1

java.time

Вы должны использовать java.time рамки, встроенные в Java 8 и более поздних версий. Избегайте старых и печально известных проблемных классов java.util.Date/.Calendar.

Эти новые классы java.time включают в себя LocalDate только для даты и времени без времени суток или часового пояса. Обратите внимание, что вы должны указать часовой пояс, чтобы определить «сегодня», поскольку дата не одинакова во всем мире.

ZoneId zoneId = ZoneId.of ("America/Montreal"); 
ZonedDateTime now = ZonedDateTime.now (zoneId); 

IsoFields класс предоставляет информацию в соответствии со стандартом ISO 8601, включая недельный из года в течение недели на основе года.

int calendarYear = now.getYear(); 
int weekNumber = now.get (IsoFields.WEEK_OF_WEEK_BASED_YEAR); 
int weekYear = now.get (IsoFields.WEEK_BASED_YEAR); // Answer to Question 

В начале/конце года недельный год может составлять ± 1, отличный от календарного года. Например, обратите внимание на разницу между григорианскими и ISO 8601 календарями на конец 2015 года: недели 52 & 1 стать 52 & 53.

enter image description here

enter image description here

Смежные вопросы