Как я могу преобразовать год и неделю в объект Java Date? - PullRequest
6 голосов
/ 21 апреля 2011

Как я могу преобразовать год и неделю в объект Java Date? Я использую JodaTime, но стандартные классы Java, использующие решение, тоже подойдут.

Ответы [ 5 ]

7 голосов
/ 21 апреля 2011

Решение с использованием стандартных классов Java. Это просто получает текущее время и устанавливает поля года и недели года в известные значения.

Calendar cld = Calendar.getInstance();
cld.set(Calendar.YEAR, year);
cld.set(Calendar.WEEK_OF_YEAR, week);
Date result = cld.getTime();
1 голос
/ 18 марта 2017

ТЛ; др

YearWeek.of( 2016 , 1 )
        .atDay( DayOfWeek.MONDAY )

2016-01-04

Год-неделя не дата

Строго говоря, вы не можете получить дату из года и номер недели. Но я продолжу, если вы хотите получить первый день недели для любого года и номера недели.

Использование java.time

Современный подход к классам java.time, которые вытесняют проблемные старые унаследованные классы даты и времени.

Класс WeekFields дает вам возможность работать с неделей года.

Locale определенные недели

Существует много определений недели года. В этом примере кода используется текущее значение по умолчанию JVM Locale для определения определения.

int year = 2016;
int week = 1;
int dayOfWeek = 1;  // 1-7, locale-dependent such as Sunday-Monday in US.
WeekFields weekFields = WeekFields.of ( Locale.CANADA_FRENCH );
LocalDate ld = LocalDate.now ( )
        .withYear ( year )
        .with ( weekFields.weekOfYear ( ), week )
        .with ( weekFields.dayOfWeek ( ), 1 );

System.out.println ( "ld: " + ld );

Обратите внимание, что в этом определении недель первый день недели в начале года (2016) фактически является днем ​​ближе к концу предыдущего года (2015).

2015-12-27

ISO 8601 стандартная неделя

Ваш бизнес может выбрать принятие стандартных ISO 8601 недель. В этой простой схеме неделя № 1 содержит первый четверг календарного года, а неделя длится с понедельника по воскресенье. В году 52 или 53 недели.

Тот же код, что и выше, но мы отключаем зависящий от локали объект WeekFields с постоянной, определенной ISO, WeekFields.ISO. Но мы получаем совсем другой результат, 2016-01-04, а не 2015-12-27.

int year = 2016;
int week = 1;
int dayOfWeek = 1;  // 1-7, locale-dependent such as Sunday-Monday in US.
WeekFields weekFields = WeekFields.ISO;
LocalDate ld = LocalDate.now ( )
        .withYear ( year )
        .with ( weekFields.weekOfYear ( ), week )
        .with ( weekFields.dayOfWeek ( ), 1 );

System.out.println ( "ld: " + ld );
* * 2016-01-04 тысяча сорок-девять

YearWeek

Эта работа будет проще, если вы добавите библиотеку ThreeTen-Extra в свой проект. Вы можете использовать класс YearWeek для стандартных недель ISO 8601.

Не путайте номер календарного года с номером года в году.

YearWeek yw = YearWeek.of( 2016 , 1 ); // Passing a week-based-year number, *NOT* a calendar year.

Метод toString создает строку в стандартном формате ISO 8601 yyyy-Www, например 2016-W01.

Чтобы получить определенную дату, укажите день недели, используя перечисляемые в Java объекты DayOfWeek.

LocalDate ld = yw.atDay( DayOfWeek.MONDAY );

Вы можете спросить, есть ли в недельном году 52 или 53 недели.

int weeksInWeekBasedYear = yw.lengthOfYear();

О java.time

Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы заменяют проблемные старые унаследованные классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , в настоящее время находящийся в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Где получить классы java.time?

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и more .

1 голос
/ 21 апреля 2011

вы можете использовать устаревший java.util.Date(int,int,int,int,int,int) конструктор, например, new Date(2011,2,12,10,13,13); или
, использовать java.util.Calendar и использовать его set(int,int) методы (например, c.set(Calendar.DAY_OF_MONTH,22);, чтобы установить день на 22). Вы можете использовать Calendar.getTime() чтобы вернуть текущее календарное время как java.util.Date.Разница между конструктором даты и календарем заключается в том, что только календарь способен создавать даты для часовых поясов, отличных от UTC (что также является причиной того, что конструктор даты не рекомендуется).

1 голос
/ 21 апреля 2011

Я не использовал Joda-Time (хотя я слышал, что это здорово), но я думаю о комбинации DateTime конструктора и удобного plusWeeks метода должен сделать свое дело.Например:

DateTime dt = new DateTime(theYear, 1, 1, 0, 0, 0, 0).plusWeeks(theWeeks);

... поскольку Joda-Time , по-видимому, использует месяцы и дни на основе 1 и нулевое время.

0 голосов
/ 29 декабря 2016

Этот кусок довольно уродливого кода с org.joda.time.DateTime работал для меня. Метод plusWeeks не работает, поскольку он не перемещает дату в начало недели. Если вы добавите недели к четвергу, то и итоговая дата будет четвергом.

DateTime startOfTheWeek = new DateTime().withYear(2016).withWeekOfWeekyear(52)
.withDayOfWeek(1).withTimeAtStartOfDay();
DateTime endOfTheWeek = startOfTheWeek.withDayOfWeek(7).withTime(23,59,59,999);
System.out.println("Start date: " + startOfTheWeek.toDate());
System.out.println("End date: " + endOfTheWeek.toDate());

Это печатает что-то вроде:

Start date: Mon Dec 26 00:00:00 EET 2016
End date: Sun Jan 01 23:59:59 EET 2017
...