31
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        String date = sdf.format(new Date()); 
        System.out.println(date); 
        

Result is todays date i.e 23/03/2014

But when I do

 SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy"); 

result can be 23/04/2014, 23/05/2014, 23/06/2014 and so on with each run of program. Why so?

akib khan
  • 451
  • 4
  • 9
user3198603
  • 5,528
  • 13
  • 65
  • 125
  • 2
    Have a look at the javadoc : http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html – Fidan Hakaj Mar 23 '14 at 11:42
  • 17
    If you are particularly unlucky, results could also be `23/59/2014`. – Sergey Kalinichenko Mar 23 '14 at 11:42
  • 1
    **Update:** These classes `SimpleDateFormat` and `java.sql.Date` have been supplanted by the modern *java.time* classes defined in JSR 310. Specifically replaced by `DateTimeFormatter` and `LocalDate`. See modern solution in [Answer by Avinash](https://stackoverflow.com/a/76723160/642706). – Basil Bourque Jul 21 '23 at 21:43

5 Answers5

63

It's because mm is for minutes, not months. More in the documentation.

T.J. Crowder
  • 1,031,962
  • 187
  • 1,923
  • 1,875
44

In C# and VB.NET, it's a case sensitive especially to format the Month or Minutes. Because initial character of both the words is same.

The following detail may help you in formatting the date & time.

1. d/D: day without 0 prefix on single digit. 
2. dd/DD: day with 0 prefix if single digit.
3. M: Month without 0 prefix on single digit.
4. MM: Month with 0 prefix if single digit.
5. yy/YY: Last two digit of year.
6. yyyy/YYYY: represents full year.
7. HH: 24 hour based hour. ie. 13:00. **H** will display hour without prefix 0 if single digit
8. hh: 12 hour based hour. ie. 01:00. **h** will display hour without prefix 0 if single digit
9. m: minute without 0 prefix on single digit. 
10.mm: minute with 0 prefix if single digit.
11.s: second without 0 prefix on single digit. 
12.ss: second with 0 prefix if single digit.
13.tt: represent the AM or PM
Shell
  • 6,818
  • 11
  • 39
  • 70
11

mm represents minutes, so when you use mm, it will print minutes instead of month.

While MM represents months.

Read more about Time Patterns

Salah
  • 8,567
  • 3
  • 26
  • 43
3

Yes it is because mm represents minutes

 Date date=new Date();
    System.out.println(date);
    System.out.println("Date: "+new SimpleDateFormat("dd/MM/yyyy").format(date));
    System.out.println("Date: "+new SimpleDateFormat("dd/mm/yyyy").format(date));

if you observed the output you will find when we print date object, there is value of minutes, month, etc and in 2nd line and 3rd line same minute is printed corresponding to mm and month value is printed corresponding to MM

Thu Feb 20 14:33:00 IST 2020
20/02/2020
20/33/2020
sanjeevjha
  • 1,439
  • 14
  • 18
2

java.time

The accepted answer is correct and also applicable to the modern date-time API. More in the documentation.

Note that Java-8, released in March 2014, introduced the modern date-time API which supplanted the outdated and error-prone java.util Date-Time API and their formatting API, SimpleDateFormat. Since then it has been strongly recommended to switch to the modern Date-Time API.

Demo using java.time, the modern Date-Time API:

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/uuuu", Locale.ENGLISH);
        System.out.println(LocalDate.now().format(formatter));

        // Alternatively,
        System.out.println(formatter.format(LocalDate.now()));
    }
}

Output:

19/07/2023
19/07/2023

ONLINE DEMO

Note: Here, you can use y instead of u but I prefer u to y.

Learn more about the modern Date-Time API from Trail: Date Time.

Arvind Kumar Avinash
  • 71,965
  • 6
  • 74
  • 110
  • 1
    Thanks for the good answer. While the same solution applies to java.time as applied to `SimpleDateFormat` in its days, the problem manifests quite differently. `SimpleDateFormat` gave nonsense output, which was awfully typical for that class. `LocalDate` will throw an exception because a date hasn’t got minutes and thus make sure that the problem is noticed and no nonsense output is produced. One of the many advantages of java.time. – Ole V.V. Aug 13 '23 at 20:41