HiveBrain v1.2.0
Get Started
← Back to all entries
patternjavaCritical

Java string to date conversion

Submitted by: @import:stackoverflow-api··
0
Viewed 0 times
stringconversiondatejava

Problem

What is the best way to convert a String in the format 'January 2, 2010' to a Date in Java?

Ultimately, I want to break out the month, the day, and the year as integers so that I can use

Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();


to convert the date into time.

Solution

That's the hard way, and those java.util.Date setter methods have been deprecated since Java 1.1 (1997). Moreover, the whole java.util.Date class was de-facto deprecated (discommended) since introduction of java.time API in Java 8 (2014).

Simply format the date using DateTimeFormatter with a pattern matching the input string (the tutorial is available here).

In your specific case of "January 2, 2010" as the input string:

  • "January" is the full text month, so use the MMMM pattern for it



  • "2" is the short day-of-month, so use the d pattern for it.



  • "2010" is the 4-digit year, so use the yyyy pattern for it.



String string = "January 2, 2010";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(string, formatter);
System.out.println(date); // 2010-01-02


Note: if your format pattern happens to contain the time part as well, then use LocalDateTime#parse(text, formatter) instead of LocalDate#parse(text, formatter). And, if your format pattern happens to contain the time zone as well, then use ZonedDateTime#parse(text, formatter) instead.

Here's an extract of relevance from the javadoc, listing all available format patterns:

Symbol
Meaning
Presentation
Examples

G
era
text
AD; Anno Domini; A

u
year
year
2004; 04

y
year-of-era
year
2004; 04

D
day-of-year
number
189

M/L
month-of-year
number/text
7; 07; Jul; July; J

d
day-of-month
number
10

Q/q
quarter-of-year
number/text
3; 03; Q3; 3rd quarter

Y
week-based-year
year
1996; 96

w
week-of-week-based-year
number
27

W
week-of-month
number
4

E
day-of-week
text
Tue; Tuesday; T

e/c
localized day-of-week
number/text
2; 02; Tue; Tuesday; T

F
week-of-month
number
3

a
am-pm-of-day
text
PM

h
clock-hour-of-am-pm (1-12)
number
12

K
hour-of-am-pm (0-11)
number
0

k
clock-hour-of-am-pm (1-24)
number
0

H
hour-of-day (0-23)
number
0

m
minute-of-hour
number
30

s
second-of-minute
number
55

S
fraction-of-second
fraction
978

A
milli-of-day
number
1234

n
nano-of-second
number
987654321

N
nano-of-day
number
1234000000

V
time-zone ID
zone-id
America/Los_Angeles; Z; -08:30

z
time-zone name
zone-name
Pacific Standard Time; PST

O
localized zone-offset
offset-O
GMT+8; GMT+08:00; UTC-08:00;

X
zone-offset 'Z' for zero
offset-X
Z; -08; -0830; -08:30; -083015; -08:30:15;

x
zone-offset
offset-x
+0000; -08; -0830; -08:30; -083015; -08:30:15;

Z
zone-offset
offset-Z
+0000; -0800; -08:00;

Do note that it has several predefined formatters for the more popular patterns. So instead of e.g. DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);, you could use DateTimeFormatter.RFC_1123_DATE_TIME. This is possible because they are, on the contrary to SimpleDateFormat, thread safe. You could thus also define your own, if necessary.

For a particular input string format, you don't need to use an explicit DateTimeFormatter: a standard ISO 8601 date, like 2016-09-26T17:44:57Z, can be parsed directly with LocalDateTime#parse(text) as it already uses the ISO_LOCAL_DATE_TIME formatter. Similarly, LocalDate#parse(text) parses an ISO date without the time component (see ISO_LOCAL_DATE), and ZonedDateTime#parse(text) parses an ISO date with an offset and time zone added (see ISO_ZONED_DATE_TIME).

Pre-Java 8

In case you're not on Java 8 yet, or are forced to use java.util.Date, then format the date using SimpleDateFormat using a format pattern matching the input string.

String string = "January 2, 2010";
DateFormat format = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH);
Date date = format.parse(string);
System.out.println(date); // Sat Jan 02 00:00:00 GMT 2010


Note the importance of the explicit Locale argument. If you omit it, then it will use the default locale which is not necessarily English as used in the month name of the input string. If the locale doesn't match with the input string, then you would confusingly get a java.text.ParseException even though when the format pattern seems valid.

Here's an extract of relevance from the javadoc, listing all available format patterns:

Letter
Date or Time Component
Presentation
Examples

G
Era designator
Text
AD

y
Year
Year
1996; 96

Y
Week year
Year
2009; 09

M/L
Month in year
Month
July; Jul; 07

w
Week in year
Number
27

W
Week in month
Number
2

D
Day in year
Number
189

d
Day in month
Number
10

F
Day of week in month
Number
2

E
Day in week
Text
Tuesday; Tue

u
Day number of week
Number
1

a
Am/pm marker
Text
PM

H
Hour in day (0-23)
Number
0

k
Hour in day (1-24)
Number
24

K
Hour in am/pm (0-11)
Number
0

h
Hour in am/pm (1-12)
Number
12

m
Minute in hour
Number
30

s
Second in minute
Number
55

S
Millisecond
Number
978

z
Time zone
General time zone
Pacific Standard Time; PST; GMT-08:00

Z
Time zone
RFC 822 time zone
-0800

X
Time zone
ISO 8601 time

Code Snippets

String string = "January 2, 2010";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(string, formatter);
System.out.println(date); // 2010-01-02
String string = "January 2, 2010";
DateFormat format = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH);
Date date = format.parse(string);
System.out.println(date); // Sat Jan 02 00:00:00 GMT 2010

Context

Stack Overflow Q#4216745, score: 1853

Revisions (0)

No revisions yet.