Home > Enterprise >  Java LocalDate invalid date formatting
Java LocalDate invalid date formatting

Time:01-04

I have a script to get previous month for current date (script executed on 1st date monthly) the script return valid result for all other month except on January

I tried to reproduce the case with these script

import java.time.*;

class Main {
  public static void main(String[] args) {
    LocalDate today = LocalDate.of(2022, 1, 1); 
    LocalDate prevMonth = today.minusDays(1); 
    
    System.out.println("Date object "   prevMonth);
    System.out.println("Date formatted "   prevMonth.format(DateTimeFormatter.ofPattern("YYYY-MM-dd")));
  }
}

Output:

Date object 2021-12-31
Date formatted 2022-12-31

result

Environment

openjdk 11.0.11 2021-04-20
OpenJDK Runtime Environment (build 11.0.11 9-Ubuntu-0ubuntu2.18.04)
OpenJDK 64-Bit Server VM (build 11.0.11 9-Ubuntu-0ubuntu2.18.04, mixed mode, sharing)

Where is the bug come from, or you have better idea ?

ps: I preffered LocalDate over Calendar

CodePudding user response:

You really need to carefully read the docs.

Do not use Y.

Y means 'weekyear'. You really, really, really do not want this. It'll turn 2022 somewhere around jan 1st, but not on jan 1st (well, one it about 7 years or so, it manages to line up perfectly). There will be days in year X that have a weekyear of year (X 1), and there will be days in year Z that will have a weekyear of year (Z-1): After all, a week starts on monday, so 'weekyear' can't change except on mondays. Turns out Jan 1st? Not always a Monday.

You want u. y is always great, but y does silly things for years before the year 0. Aside from that, u and y are identical. In other words, u is just better, it's the one you should use.

You also do not want D.

D means day-of-year. You wanted day-of-month. That's the symbol d (lowercase).

Try "uuuu-MM-dd".

CodePudding user response:

Uppercase 'D' is Day of year, not day of month.
https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

You are likely looking for 'd' - Day of Month. DateTimeFormatter.ofPattern("YYYY-MM-dd")

  •  Tags:  
  • Related