Convert String to Calendar Object in Java
Note that this looses the timezone information. The Calendar object will have the system default TimeZone not the parsed one.
This should not be the top/accepted answer any more. Since Java 8 is already out for more than 4 years the answer should be updated to mention java.time . This Q/A comes up pretty prominent on google.
tl;dr
The modern approach uses the java.time classes.
YearMonth.from( ZonedDateTime.parse( "Mon Mar 14 16:02:37 GMT 2011" , DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" ) ) ).toString()
Avoid legacy date-time classes
The modern way is with java.time classes. The old date-time classes such as Calendar have proven to be poorly-designed, confusing, and troublesome.
Define a custom formatter to match your string input.
String input = "Mon Mar 14 16:02:37 GMT 2011"; DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
You are interested in the year and month. The java.time classes include YearMonth class for that purpose.
YearMonth ym = YearMonth.from( zdt );
You can interrogate for the year and month numbers if needed.
int year = ym.getYear(); int month = ym.getMonthValue();
But the toString method generates a string in standard ISO 8601 format.
String output = ym.toString();
String input = "Mon Mar 14 16:02:37 GMT 2011"; DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" ); ZonedDateTime zdt = ZonedDateTime.parse( input , f ); YearMonth ym = YearMonth.from( zdt ); int year = ym.getYear(); int month = ym.getMonthValue();
System.out.println( "input: " + input ); System.out.println( "zdt: " + zdt ); System.out.println( "ym: " + ym );
input: Mon Mar 14 16:02:37 GMT 2011
Live code
Conversion
If you must have a Calendar object, you can convert to a GregorianCalendar using new methods added to the old classes.
GregorianCalendar gc = GregorianCalendar.from( zdt );
About java.time
The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date , Calendar , & SimpleDateFormat .
To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.
The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.
You may exchange java.time objects directly with your database. Use a JDBC driver compliant with JDBC 4.2 or later. No need for strings, no need for java.sql.* classes. Hibernate 5 & JPA 2.2 support java.time.
Where to obtain the java.time classes?
- Java SE 8, Java SE 9, Java SE 10, Java SE 11, and later — Part of the standard Java API with a bundled implementation.
- Java 9 brought some minor features and fixes.
- Most of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport.
- Later versions of Android (26+) bundle implementations of the java.time classes.
- For earlier Android (<26), the process of API desugaring brings a subset of the java.time functionality not originally built into Android.
- If the desugaring does not offer what you need, the ThreeTenABP project adapts ThreeTen-Backport (mentioned above) to Android. See How to use ThreeTenABP….
Just to add to this, one can access the Day from the ZonedDateTime Object. For example: zdt.getDayOfMonth() (returns int ), zdt.getDayOfYear() (returns int ), or zdt.getDayOfWeek() (returns java.time.DayOfWeek ).
Well, I think it would be a bad idea to replicate the code which is already present in classes like SimpleDateFormat .
On the other hand, personally I’d suggest avoiding Calendar and Date entirely if you can, and using Joda Time instead, as a far better designed date and time API. For example, you need to be aware that SimpleDateFormat is not thread-safe, so you either need thread-locals, synchronization, or a new instance each time you use it. Joda parsers and formatters are thread-safe.
Thanks for your input, I will certainly look into using Joda in the future, looks like it can be very useful
@Jon Skeet Joda will not deserialize in Android. Joda is worth little unless you have no need to save dates and time.
@FrankZappa: I’d disagree with that — you can do all your date/time calculations in Joda Time, but then convert to other types (maybe just strings for simplicity) for serialization purposes.
Sorry, had to downvote, the answer is too old, it’s outdated to be the highest ranking answer. Today java.time is the way to go, Basil Bourque provided an excellent answer.
@Scolytus: The top (and accepted) answer has 332 votes compared with 10 on this one. I think if you go round downvoting every 7+-year-old answer that has a better solution now, you’ll run out of downvotes. (I agree that Basil’s answer is good, and I’ve upvoted that.)
No new Calendar needs to be created, SimpleDateFormat already uses a Calendar underneath.
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.EN_US); Date date = sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));// all done Calendar cal = sdf.getCalendar();
(I can’t comment yet, that’s why I created a new answer)
Your solution looks elegant, but has two disadvantages: 1. The JavaDoc doesn’t guarantee that the behavior is, as expected. 2. At least for Java 6 you find a path at line 1353 where the calendar-object is cloned. So then then !date.equals(cal.getTime()).
SimpleDateFormat is great, just note that HH is different from hh when working with hours. HH will return 24 hour based hours and hh will return 12 hour based hours.
For example, the following will return 12 hour time:
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm aa");
While this will return 24 hour time:
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
Parse a time with timezone, Z in pattern is for time zone
String aTime = "2017-10-25T11:39:00+09:00"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault()); try < Calendar cal = Calendar.getInstance(); cal.setTime(sdf.parse(aTime)); Log.i(TAG, "time https://i.stack.imgur.com/jjNOi.png" rel="noreferrer">
If we don't set the time zone in pattern like
yyyy-MM-dd'T'HH:mm:ss
.SimpleDateFormat
will use the time zone which have set inSetting