How can I parse a date including timezone with Joda Time
OK, further Googling gave me the answer to my own question: use withOffsetParsed()
, as so:
final DateTimeFormatter df = DateTimeFormat
.forPattern("EEE MMM dd HH:mm:ss 'GMT'Z yyyy");
final DateTime dateTime = df.withOffsetParsed()
.parseDateTime("Mon Aug 24 12:36:46 GMT+1000 2009");
This works.
also you can chose:
// parse using the Paris zone
DateTime date = formatter.withZone(DateTimeZone.forID("Europe/Paris")).parseDateTime(str);
java.time
Quoted below is a notice from the home page of Joda-Time:
Note that from Java SE 8 onwards, users are asked to migrate to java.time (JSR-310) - a core part of the JDK which replaces this project.
Do not use a fixed text for the timezone:
Do not use a fixed text (e.g. 'GMT'
) for the timezone as you have done because that approach may fail for other locales.
Solution using java.time
, the modern Date-Time API:
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
String strDateTime = "Mon Aug 24 12:36:46 GMT+1000 2009";
DateTimeFormatter parser = DateTimeFormatter.ofPattern("E MMM d H:m:s VVZ u", Locale.ENGLISH);
OffsetDateTime odt = OffsetDateTime.parse(strDateTime, parser);
System.out.println(odt);
// Custom fromat
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH);
System.out.println(formatter.format(odt));
}
}
Output:
2009-08-24T12:36:46+10:00
2009-08-24T12:36:46.000+10:00
ONLINE DEMO
Learn more about the modern Date-Time API from Trail: Date Time.
* For any reason, if you have to stick to Java 6 or Java 7, you can use ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and How to use ThreeTenABP in Android Project.