17

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!

sn0ep
  • 3,843
  • 8
  • 39
  • 63
  • 5
    `Date` also has time information. –  Sep 16 '13 at 08:35
  • 1
    Ok, but still i need it to be a DateTime Object :) – sn0ep Sep 16 '13 at 08:36
  • 4
    Java has no `DateTime` class. Use `Date`. –  Sep 16 '13 at 08:36
  • 3
    Are you talking about java api or the joda time api? – Thihara Sep 16 '13 at 08:37
  • 1
    FYI, the troublesome old date-time classes such as [`java.util.Date`](https://docs.oracle.com/javase/10/docs/api/java/util/Date.html), [`java.util.Calendar`](https://docs.oracle.com/javase/10/docs/api/java/util/Calendar.html), and `java.text.SimpleDateFormat` are now [legacy](https://en.wikipedia.org/wiki/Legacy_system), supplanted by the [*java.time*](https://docs.oracle.com/javase/10/docs/api/java/time/package-summary.html) classes built into Java 8 and later. See [*Tutorial* by Oracle](https://docs.oracle.com/javase/tutorial/datetime/TOC.html). – Basil Bourque Apr 10 '18 at 20:36
  • Similar to [Generic support for ISO 8601 format in Java 6](https://stackoverflow.com/questions/13040143/generic-support-for-iso-8601-format-in-java-6). – Ole V.V. Feb 16 '21 at 20:49

5 Answers5

8

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)
BackSlash
  • 21,927
  • 22
  • 96
  • 136
7

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);
Community
  • 1
  • 1
Rahul
  • 44,383
  • 11
  • 84
  • 103
  • +1 for the use of Joda - it's a far better date implementation as the basic Java one – Guillaume Sep 16 '13 at 08:39
  • 1
    @RJ Your link points to the wrong `Date`, it's `java.util.Date`, not `java.sql.Date` :) – BackSlash Sep 16 '13 at 08:40
  • `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. – Basil Bourque Apr 10 '18 at 20:38
5

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");
Ajinkya
  • 22,324
  • 33
  • 110
  • 161
0

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

Ole V.V.
  • 81,772
  • 15
  • 137
  • 161
0

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));
AminST
  • 323
  • 3
  • 11