11

I'm converting time from CST to local time but getTimeZone doesn't seem to work properly.

    String cstTime = "2013-06-21 14:00:00";

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
            "yyyy-MM-dd HH:mm:ss");
    simpleDateFormat.setTimeZone(TimeZone.getTimeZone("CST"));

    Date date = null;
    try {
        date = simpleDateFormat.parse(cstTime);
    } catch (ParseException e) {
        System.out.println("Parse time error");
        e.printStackTrace();
    }

    TimeZone destTz = TimeZone.getDefault();//here I should get EDT on my phone
    simpleDateFormat.setTimeZone(destTz);
    String convertedLocalTime = simpleDateFormat.format(date);

    //the converted time I get is  "2013-06-21 10:00:00" 
    //but it should be             "2013-06-21 15:00:00" 

It seems to be using GMT instead of CST and below is what I got when debugging:

String abc = TimeZone.getTimeZone("CST").toString();
System.out.println("CST:"+abc);
Output:
I/System.out(19404): CST:java.util.SimpleTimeZone[id=GMT,offset=0,dstSavings=3600000,
useDaylight=fals‌​e,startYear=0,startMode=0,startMonth=0,startDay=0,startDayOfWeek=0,
startTime=0,en‌​dMode=0,endMonth=0,endDay=0,endDayOfWeek=0,endTime=0]

Is it using GMT? why.. Thanks in advance!

Edit:

Finally got it work by using

simpleDateFormat.setTimeZone(TimeZone.getTimeZone( "GMT-5")); //GMT-5 is for CDT, I found my server is actually using CDT not CST

Still don't know why using the string "CST" can't work...

Arch1tect
  • 4,128
  • 10
  • 48
  • 69
  • 1
    Don't use short names for TimeZone always use long names. EST could be Eastern Standard Time as well as some other timezone – kosa Jun 21 '13 at 19:21
  • http://stackoverflow.com/questions/2407719/android-convert-central-time-to-local-time. might help – Raghunandan Jun 21 '13 at 19:21
  • 1
    @Nambari tried "Central Standard Time" still get GMT... – Arch1tect Jun 21 '13 at 19:30
  • to get EST, in general we use America/New_York, see if you have anything like this in Timezone database. – kosa Jun 21 '13 at 19:41
  • 3
    US Central Standard Time should usually be specified as `America/Chicago`. Don't pass `GMT-5` or you're not going to get the proper adjustments when transitioning from CST to CDT. – Matt Johnson-Pint Jun 21 '13 at 20:03
  • http://stackoverflow.com/questions/9429357/date-and-time-conversion-to-some-other-timezone-in-java this should solve your problem – user55926 Mar 12 '15 at 10:00

6 Answers6

10

From the javadoc for getTimeZone:

Returns a TimeZone corresponding to the given id, or GMT for unknown ids. 

An ID can be an Olson name of the form Area/Location, such as America/Los_Angeles. 
The getAvailableIDs() method returns the supported names. 

Try using getAvailableIDs?

DevOfZot
  • 1,362
  • 1
  • 13
  • 26
4

You can use "CST6CDT" Timezone it will automatically provide you the correct time when the Central Daylight Time (CDT) switched back to CST or vice versa.

udyan
  • 141
  • 5
2

The following seems to have worked for me as was facing similar issues:

Calendar c = Calendar.getInstance(TimeZone.getTimeZone("America/Chicago"));
j2emanue
  • 60,549
  • 65
  • 286
  • 456
2

The following code helped me.

TimeZone tzone = TimeZone.getTimeZone("Singapore");
// set time zone to default
tzone.setDefault(tzone);
Andoy Abarquez
  • 1,119
  • 4
  • 17
  • 30
1

for any date time conversion i would suggest using JODA date time, its help me solve a bunch of date time issues.

you can initialize a date with a time zone, and convert between them very easily

DateTimeZone zone = DateTimeZone.forID("Europe/London");

or

DateTimeZone zoneUTC = DateTimeZone.UTC;

from JODA DATE TIME API

DateTime(DateTimeZone zone)
Constructs an instance set to the current system millisecond time using ISOChronology in the specified time zone.
Andy B
  • 328
  • 3
  • 9
0

One thing I found is that Java's TimeZone doesn't recognize "+09:00", but it does recognize "GMT+09:00" and "GMT+0900".

gknauth
  • 2,310
  • 2
  • 29
  • 44