How to Parse Date in java [duplicate]
How to Parse Date in java [duplicate]
This question already has an answer here:
Unparseable date: "Tue Jul 03 16:59:51 IST 2018" Exception
String date="Tue Jul 03 16:59:51 IST 2018";
i want to parse it.
My code is
SimpleDateFormat newformat=SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
Date d=newformat.parse(date);
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
Your pattern has to match the string you provide
– XtremeBaumer
Jul 3 at 9:36
SimpleDateFormat
looks at the first element of the format pattern string, yyyy
, this means 4-digit year. Then it looks at the first element of your date string, Tue
. Tue
cannot be a four digit year. Therefore it throws the exception (it probably only needs to look at the T
to decide).– Ole V.V.
Jul 3 at 13:51
SimpleDateFormat
yyyy
Tue
Tue
T
I recommend you avoid the
SimpleDateFormat
class. It is not only long outdated, it is also notoriously troublesome. Today we have so much better in java.time
, the modern Java date and time API and its DateTimeFormatter
.– Ole V.V.
Jul 4 at 8:33
SimpleDateFormat
java.time
DateTimeFormatter
2 Answers
2
You are using old and quite problematic classes, especially Date.
For your example, perhaps consider using LocalDateTime
String date = "Tue Jul 03 16:59:51 IST 2018";
DateTimeFormatter format = DateTimeFormatter
.ofPattern("EEE MMM dd HH:mm:ss z yyyy");
LocalDateTime dateTime = LocalDateTime.parse(date, format);
I can’t decide whether I want to recommend
ZonedDateTime
over LocalDateTime
here. The string includes a time zone abbreviation, so it could be considered a shame to throw it away from the outset. On the other hand, three and four letter time zone abbreviations are generally ambiguous, so if trying to parse it, we risk a result that conflicts with what was intended. LocalDateTime
evades that problem.– Ole V.V.
Jul 4 at 10:47
ZonedDateTime
LocalDateTime
LocalDateTime
@OleV.V. Funnily enough I wrote the answer initially with
ZonedDateTime
but edited it to LocalDateTime
.– notyou
Jul 4 at 10:55
ZonedDateTime
LocalDateTime
Since your pattern has to match the string you want to parse you need to adjust the pattern as following:
EEE MMM dd HH:mm:ss z yyyy
Infos gathered from the docs.
You should also use the new java.time
API introduced with Java 8.
java.time
String s = "Tue Jul 03 16:59:51 IST 2018";
//Java 7 way
SimpleDateFormat newformat = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
Date d = newformat.parse(s);
//Java 8 way
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss z yyyy");
LocalDateTime dateTime = LocalDateTime.parse(s, formatter);
hum, you do you expect your pattern to parse your string ? it's just impossible, string is Day Month year, and pattern is year-month-day, you should learn to build pattern
– azro
Jul 3 at 9:35