Human readable and parsable date format in Java

Viewed 22344

I want to save a Date object to a readable string (for example 22/10/2009 21:13:14) that is also parsable back to a Date object.

I have tried many things and the best I could find was to use DateFormater for parsing and formating but it has a setback. When you format a date you lose seconds information. I tried to find if there is an option to format it and display the seconds (even better would be to the millisecond level since that's the resolution the Date object allows you to have) but I came up short.

Any ideas?

6 Answers

ISO 8601

Use ISO 8601 format.

  • It’s flexible, it includes seconds and fraction of second if there are any, but you may also leave them out if they are 0.
  • It’s standard, so more and more tools format and parse it. Great for serialization for storage or data interchange.
  • It goes like 2009-10-22T21:13:14, I should say it’s pretty human-readable (though the T in the middle that denotes the start of the time part may feel unusual at first).
  • The strings sort properly, as mikera requested in another answer, as long as the years are in the four-digit range from 1000 through 9999.
  • The classes of java.time, the modern Java date and time API, as well as those of Joda Time parse ISO 8601 as their default, that is, without any explicit formatter, and produce the same format from their toString methods.

A modest demonstration of using java.time:

LocalDateTime dateTime = LocalDateTime.of(2009, 10, 22, 21, 13, 14);
String readableString = dateTime.toString();
System.out.println(readableString);
LocalDateTime parsedBack = LocalDateTime.parse(readableString);
System.out.println(parsedBack);

This prints two identical lines:

2009-10-22T21:13:14
2009-10-22T21:13:14

The latter System.out.println() call implicitly calls toString() once more, so this shouldn’t surprise.

If you want to do it a little simpler, and be spared from making your own DateFormat that most other Answers involve, you can leverage the default format in java.time.Instant:

(new Date()).toInstant.toString();
Related