21

I have a string from a json response:

start: "2013-09-18T20:40:00+0000",
end: "2013-09-18T21:39:00+0000",

How do i convert this string to a java DateTime Object?

i have tried using the following:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
start = sdf.parse("2013-09-18T20:40:00+0000");

but with this i can only create a Date Object. But the time binded in the String is kinda essential.

Any Help is greatly appreciated!

6
  • 5
    Date also has time information. Commented Sep 16, 2013 at 8:35
  • 1
    Ok, but still i need it to be a DateTime Object :) Commented Sep 16, 2013 at 8:36
  • 4
    Java has no DateTime class. Use Date. Commented Sep 16, 2013 at 8:36
  • 3
    Are you talking about java api or the joda time api? Commented Sep 16, 2013 at 8:37
  • 1
    FYI, the troublesome old date-time classes such as java.util.Date, java.util.Calendar, and java.text.SimpleDateFormat are now legacy, supplanted by the java.time classes built into Java 8 and later. See Tutorial by Oracle. Commented Apr 10, 2018 at 20:36

5 Answers 5

10

You can create Joda DateTime object from the Java Date object, since Java does not have a DateTime class.

DateTime dt = new DateTime(start.getTime());

Though the Date class of Java holds the time information as well(that's what you need in the first place), I suggest you to use a Calendar instead of the Date class of Java.

Calendar myCal = new GregorianCalendar();
myCal.setTime(date);

Have a look at the Calendar docs for more info on how you can use it more effectively.


Things have changed and now even Java (Java 8 to be precise), has a LocalDateTime and ZonedDateTime class. For conversions, you can have a look at this SO answer(posting an excerpt from there).

Given: Date date = [some date]

(1) LocalDateTime << Instant<< Date

Instant instant = Instant.ofEpochMilli(date.getTime());
LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);

(2) Date << Instant << LocalDateTime

Instant instant = ldt.toInstant(ZoneOffset.UTC);
Date date = Date.from(instant);
Sign up to request clarification or add additional context in comments.

3 Comments

+1 for the use of Joda - it's a far better date implementation as the basic Java one
@RJ Your link points to the wrong Date, it's java.util.Date, not java.sql.Date :)
LocalDateTime is the wrong type to use here. You would be throwing away valuable time zone or offset-from-UTC information. Use ZonedDateTime when you want to view an Instant in another region’s wall-clock time.
10

You don't need a DateTime object. java.util.Date stores the time too.

int hours = start.getHours(); //returns the hours
int minutes = start.getMinutes(); //returns the minutes
int seconds = start.getSeconds(); //returns the seconds

As R.J says, these methods are deprecated, so you can use the java.util.Calendar class:

Calendar calendar = Calendar.getInstance();
calendar.setTime(sdf.parse("2013-09-18T20:40:00+0000"));
int hour = calendar.get(Calendar.HOUR); //returns the hour
int minute = calendar.get(Calendar.MINUTE); //returns the minute
int second = calendar.get(Calendar.SECOND); //returns the second

Note: on my end, sdf.parse("2013-09-18T20:40:00+0000") fires a

java.text.ParseException: Unparseable date: "2013-09-18T20:40:00+0000"
    at java.text.DateFormat.parse(DateFormat.java:357)
    at MainClass.main(MainClass.java:16)

Comments

7

You can use DateTimeFormatter

DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
DateTime time = format.parseDateTime("2013-09-18T20:40:00+0000");

2 Comments

This support is there from Android O onwards
No, @PrasadGKulkarni, it’s Joda-Time, an external library that works fine with earlier Android versions too.
1

java.time

I recommend that you use java.time, the modern Java date and time API, for your date and time work.

    String startStr = "2013-09-18T20:40:00+0000";
    OffsetDateTime start = OffsetDateTime.parse(startStr, isoFormatter);
    System.out.println(start);

Output is:

2013-09-18T20:40Z

I was using this formatter:

private static final DateTimeFormatter isoFormatter = new DateTimeFormatterBuilder()
        .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
        .appendOffset("+HHMM", "+0000")
        .toFormatter();

If by a DateTime object you meant org.joda.time.Datetime, please read this quote from the Joda-Time homepage (boldface is original):

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.

The SimpleDateFormat class that you tried to use in the question is a notorious troublemaker of a class and long outdated. Under no circumstances use it. Ever.

Links

Comments

-1

Have you try this?

Date date1=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2013-09-18T20:40:00+0000".replace("T"," ").substring(0,19));

1 Comment

Unnecessary replace function

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.