Re: capturing timezone when parsing java.util.Date
 
Robert Dodier wrote:
When a string like "2009-06-26 14:13:00-0400" is parsed to
a java.util.Date via java.text.SimpleDateFormat, the timezone
in the string is lost --- the timezone of the result isn't UTC-04:00,
instead it's the default timezone (or date formatter's timezone,
if it was assigned a non-default value).
The result is a timezone independent real time.
I could pull off the trailing timezone from the string and parse
it separately and adjust the timezone of the date by hand,
but I can't see a way to do that.
You decide timezone when you output the time.
Any advice about how to capture the timezone when parsing
a date would be appreciated.
Try and look at the following:
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
public class DateParseFormat {
     private static DateFormat dfoffset;
     private static DateFormat dfminus4;
     private static DateFormat dfplus2;
     private static void test(String s) throws ParseException {
         System.out.println("Time string: " + s);
         Date d = dfoffset.parse(s);
         System.out.println("Binary time when parsed: " + d.getTime());
         System.out.println("Formatted in -4: " + dfminus4.format(d));
         System.out.println("Formatted in +2: " + dfplus2.format(d));
     }
     public static void main(String[] args) throws ParseException {
         dfoffset = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssz");
         dfminus4 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         dfminus4.setTimeZone(TimeZone.getTimeZone("GMT-04:00"));
         dfplus2= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         dfplus2.setTimeZone(TimeZone.getTimeZone("GMT+02:00"));
         test("2009-06-26 14:13:00-0400");
         test("2009-06-26 14:13:00+0200");
     }
}
It outputs:
Time string: 2009-06-26 14:13:00-0400
Binary time when parsed: 1246039980000
Formatted in -4: 2009-06-26 14:13:00
Formatted in +2: 2009-06-26 20:13:00
Time string: 2009-06-26 14:13:00+0200
Binary time when parsed: 1246018380000
Formatted in -4: 2009-06-26 08:13:00
Formatted in +2: 2009-06-26 14:13:00
Note that:
* parse does use the time zone information
* Date is basically a binary real time independent of timezones
* you decide timezone when formatting for output
                             Also, if someone wants to
recommend a different time/date library, I would be interested.
Java's built-in time/date functions are a colossal disaster,
but I digress.
It is currently in second edition. Third edition is said to be
on its way. Someone agrees with you.
But I don't think you example is among the problems.
Arne