okay, i found the reason after going through the source code for TimeZone class
http://gcc.gnu.org/ml/java-prs/2002-q3/msg00052.html
getDSTSavings() actually doesn't check if daylight saving is in effect or not, it basically just output 1hr if TimeZone HAS a daylight saving system and 0 if TimeZone don't even use daylight saving,
so for EST, getDSTSavings() will always generate 3600000 no matter if daylight saving is in effect or not
got mislead by the wordings in the TimeZone class reference and the way u use it, seems like a lot of ppl misunderstood too as they have issued a bug to java concerning this
so i guess i will rewrite the program, and this should work
private void setCurrentGmtDatetime(String LocationID) {
TimeZone local = TimeZone.getDefault();
TimeZone result = TimeZone.getTimeZone(locationID);
Date currentDate = new Date();
//initial offset resultGMT - localGMT
int offset = (result.getRawOffset() - local.getRawOffset());
// if local is in daylight saving effect, adjust offset
if (local.inDaylightTime(currentDate)) {
offset -= local.getDSTSavings();
}
// do time convertion
// do result's daylight saving adjustment later as u will need the
// time in result location to determine if daylight is in effect
Date newDatetime = new Date(currentDate.getTime() + offset);
// check if daylight saving adjustment applies
if (result.inDaylightTime(newDatetime)) {
// use setTime to readjust, call new Date again will allocate extra memory
newDatetime.setTime(newDatetime.getTime() + result.getDSTSavings());
}
}
tested - should work