2

I'm trying to parser String to Timestamp because I need to save this data on bbdd mysql.

String dateString: "2018-10-17T22:37:10.000+0000";
java.sql.Timestamp timeStampDate = null;
try {
        DateFormat formatter;
        formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
        Date date = (Date) formatter.parse(dateString);
        timeStampDate = new Timestamp(date.getTime());

    } catch (ParseException e) {
        log.debug("ERROR parser String to Timestamp to save bbdd. ", e.getMessage());
    }

When I run my app I get this catch message:

ERROR parser String to Timestamp to save bbdd. Unparseable date: "2018-10-17T22:37:10.000+0000"

Can anybody help me?

Ole V.V.
  • 81,772
  • 15
  • 137
  • 161
Kara
  • 145
  • 1
  • 8
  • First, I recommend you avoid the `SimpleDateFormat` class. It is not only long outdated, it is also notoriously troublesome. Today we have so much better in [`java.time`, the modern Java date and time API](https://docs.oracle.com/javase/tutorial/datetime/). Second, for saving into MySQL it’s probably better to save an `Instant`, an `OffsetDateTime` or a `LocalDateTime`than a `Timestamp` (another poorly designed and outdated class). – Ole V.V. Nov 14 '18 at 14:09

2 Answers2

2

change your mask to

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSS");

so you have

java.sql.Timestamp timeStampDate = null;
String dateString = "2018-10-17T22:37:10.000+0000";

try {
    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
    Date date = formatter.parse(dateString);
    timeStampDate = new Timestamp(date.getTime());

} catch (ParseException e) {
    e.printStackTrace();
}

By the way you should not need to cast the Date

Apologies for my slackness, in my haste I did not test the output and as per @andreas comment, the correct mask is actually yyyy-MM-dd'T'HH:mm:ss.SSSZ

Scary Wombat
  • 44,617
  • 6
  • 35
  • 64
  • thanks @Scary. Now it is working. and yes, I dont need to cast the Date. – Kara Nov 14 '18 at 00:36
  • 1
    Sorry, that is wrong. First, it's `HH`, not `hh`. Second, ignoring the +0 time zone offset means you get the wrong time, e.g. I'm on US east coast, so running that code would get me time `2018-10-17 22:37:10.000 EDT`, which is not the same as time `2018-10-17T22:37:10.000+0000`, because that would be `2018-10-17 18:37:10.000 EDT`. Correct format string is `yyyy-MM-dd'T'HH:mm:ss.SSSZ` – Andreas Nov 14 '18 at 00:48
0

java.time

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXX");
    String dateString = "2018-10-17T22:37:10.000+0000";
    OffsetDateTime odt = OffsetDateTime.parse(dateString, formatter);

    System.out.println("Parsed datetime: " + odt);

Output from this code is:

Parsed datetime: 2018-10-17T22:37:10Z

For saving into MySQL it’s good to use a datetime object, but the Timestamp class has design problems and is now long outdated. I am sorry that I don’t have the experience with MySQL, but I think the following should work:

    PreparedStatement ps = myDatabaseConnection.prepareStatement(
            "insert into my_table (my_timestamp) values (?)");
    ps.setObject(1, odt);

Link: Oracle tutorial: Date Time explaining how to use java.time.

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