Reputation: 195
I want to convert to this string to LocalDateTime
object. How can I do that?
"Thu Aug 29 17:46:11 GMT+05:30 2019"
I already try something, but it didn't work.
final String time = "Thu Aug 29 17:46:11 GMT+05:30 2019";
final String format = "ddd MMM DD HH:mm:ss 'GMT'Z YYYY";
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern(format);
LocalDateTime localDateTime = LocalDateTime.parse(time, dateTimeFormatter);
Exception in thread "main" java.lang.IllegalArgumentException: Invalid format: "Thu Aug 29 17:46:11" at org.joda.time.format.DateTimeFormatter.parseLocalDateTime(DateTimeFormatter.java:900) at org.joda.time.LocalDateTime.parse(LocalDateTime.java:168)
Upvotes: 2
Views: 672
Reputation: 86232
Note that Joda-Time is considered to be a largely “finished” project. No major enhancements are planned. If using Java SE 8, please migrate to
java.time
(JSR-310).
This is quoted from the Joda-Time home page. I should say that it endorses the answer by Basil Bourque. In any case if you insist on sticking to Joda-Time for now, the answer is:
final String time = "Thu Aug 29 17:46:11 GMT+05:30 2019";
final String format = "EEE MMM dd HH:mm:ss 'GMT'ZZ YYYY";
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern(format)
.withLocale(Locale.ENGLISH)
.withOffsetParsed();
DateTime dateTime = DateTime.parse(time, dateTimeFormatter);
System.out.println(dateTime);
Output:
2019-08-29T17:46:11.000+05:30
EEE
for day of week. d
is for day of month.dd
for day of month; uppercase DD
is for day of yearZZ
because according to the docs this is for offset with a colon; Z
works in practice tooDate.toString()
originally, which always produces English, I found Locale.ROOT
appropriate.DateTIme
. To preserve the offset from the string we need to specify that through withOffsetParsed()
(you can always convert to LocalDateTime
later if desired).org.joda.time.format.DateTimeFormat
with the format pattern letters including their caseUpvotes: 3
Reputation: 1028
The format string you provided for parsing doesn't looks right with the text format you've actually got. You need to parse first, then format. Just test below code,
SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy",Locale.getDefault());
Date dt = null;
try {
dt = format.parse("Thu Aug 29 17:46:11 GMT+05:30 2019");
SimpleDateFormat out = new SimpleDateFormat("MMM dd, yyyy h:mm a");
String output = out.format(dt);
Log.e("OUTPUT",output);
} catch (Exception e) {
e.printStackTrace();
}
Upvotes: 1
Reputation: 338326
FYI, the Joda-Time project is now in maintenance mode, advising migration to the java.time classes. See Tutorial by Oracle.
OffsetDateTime.parse(
"Thu Aug 29 17:46:11 GMT+05:30 2019" ,
DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss OOOO uuuu").withLocale( Locale.US )
)
.toString()
2019-08-29T17:46:11+05:30
LocalDateTime
cannot represent a moment"Thu Aug 29 17:46:11 GMT+05:30 2019"
I want to convert to this string to LocalDateTime object.
You cannot.
LocalDateTime
cannot represent a moment. A LocalDateTime
has only a date and a time-of-day but lacks the context of a time zone or offset-from-UTC.Trying to handle your input as a LocalDateTime
would mean discarding valuable information. That would be like handling a amount of money as simply a BigDecimal
while throwing away information about which currency.
OffsetDateTime
You input string includes an offset-from-UTC of five and a half hours ahead. So parse as an OffsetDateTime
object.
Define a custom formatting pattern to match your input, using the DateTimeFormatter
class.
Define
String input = "Thu Aug 29 17:46:11 GMT+05:30 2019" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss OOOO uuuu").withLocale( Locale.US );
OffsetDateTime odt = OffsetDateTime.parse( input , f ) ;
odt.toString(): 2019-08-29T17:46:11+05:30
Tip: That input format is terrible. Educate the publisher of those input string about the standard ISO 8601 for practical date-time formats.
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.
Where to obtain the java.time classes?
Upvotes: 4