Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

SimpleDateFormat wrong week of year for last week

I need to get week of year for a given date. Using SimpleDateFormat produces wrong results for the last week of the year.

Example:

This produces week 52 correctly:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

SimpleDateFormat w = new SimpleDateFormat("w");
Calendar c = Calendar.getInstance();
c.set(2021, 11, 25);
System.out.println("Week: ${w.format(c.getTime())}");

produces: Week: 52

But the next day is already considered as 1st week of next year?

SimpleDateFormat w = new SimpleDateFormat("w");
Calendar c = Calendar.getInstance();
c.set(2021, 11, 26);
System.out.println("Week: ${w.format(c.getTime())}");

produces: Week: 1

>Solution :

Don’t use Calendar. It’s obsolete, and, more to the point, incredibly bad API.

There’s a list as long as my leg as to what’s wrong with it. The specific one of about 200 things that is relevant here is that, boneheadedly, its month value is 0 indexed. So, ’12, 3′? That’s the 3rd of Undecimber, or whatever you’d like to call the 13th month. That, or the calendar doesn’t do 13th month in which case it leniently just assumes you meant to say 3rd of jan 2022 . Either way, that’s week 1.

So why is The 2nd of undecimber (or if you prefer, via rollover, 2nd jan 2022) "Week 52"?

Because it is.

Week numbering is weird, but they have to be. A week starts on monday (or sunday, for my silly standards loving USian brethren), and can’t start on any other day. That means unless Jan 1st so happens to fall on a monday, there’s going to be weirdness; either days in 2021 counting as being in ‘week 1 of 2022’, or days in 2022 counting as ‘week 52 of 2021’. In fact, from time to time there’ll have to be a week 53. After all, 52*7 is 364, but there are 365.2475 days in a year, so unless you just want to make some days poof out of existence, every so often a week 53 has to exist for it all to add up.

Use java.time instead.

LocalDate ld = LocalDate.of(2021, 12, 3);
WeekFields wf = WeekFields.of(Locale.ENGLISH);
int weekNumber = ld.get(wf.weekOfWeekBasedYear());

java.time does many things fantastically, and one of the things is does great is that it tends not to hide complex things. For example, ‘when does a week start’ is just not answerable, not unless you tell me where on the planet you’re asking this question. Hence, ‘which week is it’ is also not actually an answerable question until you tell me exactly which week-counting system we’re using, and there is no standard that is universally accepted enough. Hence, you have to go through the rigamarole of making a separate WeekFields instance to capture that info. We do it here based on locale.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading