The instant time of the week of the year
I need instant time from the first
week of the year. Now I use the old
Calendar API to calculate the time:
int week = 1; week of year final Calendar cal = new GregorianCalendar(); cal.set(0, 1, 0, 0, 0, 0); reset calendar cal.set(Calendar.YEAR, Year.now().getValue()); cal.set(Calendar.WEEK_OF_YEAR, week); cal.setTimeZone(TimeZone.getTimeZone(ZoneOffset.UTC)); final Instant start = cal.getTime().toInstant(); final Instant end = start.plus(Period.ofWeeks(1));
Is it possible to get
Instant from one week of the year using the new Java Time API (
WeekFields wf = WeekFields.of(Locale.getDefault()); int week = 1; week of year LocalDate startDate = LocalDate.now(ZoneOffset.UTC) .with(wf.weekOfWeekBasedYear(), week) .with(wf.dayOfWeek(), 1); Instant startInstant = startDate.atStartOfDay(ZoneOffset.UTC).toInstant(); LocalDate endDate = startDate.plusWeeks(1); Instant endInstant = endDate.atStartOfDay(ZoneOffset.UTC).toInstant(); System.out.println("" + startInstant + " - " + endInstant);
My locale uses ISO weeks. The output here is:
2019-12-29T00:00:00Z – 2020-01-05T00:00:00Z
If you want an ISO week independent of the locale, set
WeekFields.ISO. If you want a different week numbering scheme, set
To prevent other readers from wondering, Kirill defines the weekend as the first moment of the following week. This is recommended. It is called using half-open intervals for time intervals.
I also agree with the issue that obviously using java.time for this task should be preferred over
Calendar is poorly designed and outdated, and I believe the code using java.time is easier to read.
Also, the code that uses
Calendar in question doesn’t set the date to the first day of the week, so it won’t give you that day. Although I haven’t tested it, I suspect that the code sometimes produces unexpected results around the New Year.
My code using
WeekFields from java.time will remain in the current week-based year, which is different from the calendar year. For example, if I run it on December 30, 2019, it will still give Week 1 of MED 2020 because we are already in that week.