Parsing dates without timezone conversion

37,839

Solution 1

Here are two ways to do it in Java:

/*
 *  Add the TimeZone info to the end of the date:
 */

String dateString = "2012-11-13 14:00:00:000";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d H:m:s:S Z");
Date theDate = sdf.parse(dateString + " UTC");

/*
 *  Use SimpleDateFormat.setTimeZone()
 */

String dateString = "2012-11-13 14:00:00:000";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d H:m:s:S");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date theDate = sdf.parse(dateString);

Note that Date.parse() is deprecated (so I did not recommend it).

Solution 2

I used Calendar to avoid timezone conversion. Although I did not use new Date(), the result is the same.

String dateString = "2012-11-13 14:00:00:000";
Calendar calendar = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d H:m:s:S");
calendar.setTime(sdf.parse(dateString));
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = calendar.getTime();
Share:
37,839
F21
Author by

F21

Founder Boostport.

Updated on July 22, 2022

Comments

  • F21
    F21 almost 2 years

    I am working with groovy (gremlin to traverse a graph database to be exact). Unfortunately, because I am using gremlin, I cannot import new classes.

    I have some date values that I wish to convert to a Unix timestamp. They are stored as UTC in the format: 2012-11-13 14:00:00:000

    I am parsing it using this snippet (in groovy):

    def newdate = new Date().parse("yyyy-M-d H:m:s:S", '2012-11-13 14:00:00:000')
    

    The problem is that it does a timezone conversion, which results in:

    Tue Nov 13 14:00:00 EST 2012
    

    And if I then convert that to a timestamp using time(), that gets converted to UTC, then the timestamp generated.

    How do I get new Date() to not do any timezone conversions when the date is first parsed (and just assume the date as UTC)?

  • Justin Piper
    Justin Piper over 11 years
    You're thinking of the Java method. Groovy provides a replacement that lets you specify a format.
  • vladr
    vladr over 11 years
    The documentation states that in order to parse the Z (uppercase) format then you must specify a RFC 822 time zone (+XXXX or -XXXX). As per same documentation, UTC should theoretically only be parseable with the z (lowercase) format. I wouldn't be surprised if in reality parse treated the two interchangeably, but just to confirm (not having access to Groovy myself): does your first example above work?
  • jahroy
    jahroy over 11 years
    Yes. Both examples worked for me (before I posted them). That being said, I don't have access to Groovy either (I've never used it). That's why I say: "Here are two ways to do it in Java". To be honest I don't really know what the relationship is between Java and Groovy. Maybe this answer is irrelevant....