UTC Daylight Issue
843798Mar 26 2009 — edited Apr 10 2009Hi all,
As you know that in the US the Daylight savings started for this year 2009 on Mar 8th 2AM. The JRE version which we are using 1.5.0_17 is aware of it and properly forwards the clock by one hour for any time starting from 03/08/2009 02:00:00.
But the problem we are having is when we give it the UTC time 03/08/2009 02:00:00 even than it forwards the clock by one hour, which is not the case as the Daylight savings in Greenwich start Mar 29th. As a result what is happening is our application needs to display the local time depending on the UTC time provided and it shows the time one hour behind than the actual time.
Do you know if its known a issue or is it something I am missing in my program(below) to convert the UTC time to local time.
import java.util.Calendar;
import java.util.GregorianCalendar;
public class CustomDate {
private Calendar date; // UTC !!!
public CustomDate() {
date = Calendar.getInstance();
date.add(Calendar.MILLISECOND, -1 * date.get(date.ZONE_OFFSET));
date.add(Calendar.MILLISECOND, -1 * date.get(date.DST_OFFSET));
}
public CustomDate(String CustomDate, boolean isUTC) {
String year = CustomDate.substring(0, 4);
String month = CustomDate.substring(5, 7);
String day = CustomDate.substring(8, 10);
String hour = CustomDate.substring(11, 13);
String min = CustomDate.substring(14, 16);
String sec = CustomDate.substring(17, 19);
String mil = CustomDate.substring(20, 23);
if (mil == null) {
mil = "000000";
}
date = new GregorianCalendar();
try {
date.set(Integer.parseInt(year),
Integer.parseInt(month) - 1,
Integer.parseInt(day),
Integer.parseInt(hour),
Integer.parseInt(min),
Integer.parseInt(sec));
date.set(Calendar.MILLISECOND, Integer.parseInt(mil));
if (!isUTC) {
date.add(Calendar.MILLISECOND,
-1 * date.get(date.ZONE_OFFSET));
date.add(Calendar.MILLISECOND,
-1 * date.get(date.DST_OFFSET));
}
} catch (Exception e) {
}
}
public CustomDate(Calendar date) {
this.date = date;
}
public Calendar getCalendar() {
return date;
}
public static String toString(Calendar calendar) {
CustomDate date = new CustomDate(calendar);
return date.toString();
}
public String toString() {
return getUTCTime();
}
public String getUTCTime() {
return convert(date);
}
public String getLocalTime() {
GregorianCalendar d = new GregorianCalendar(
date.get(Calendar.YEAR),
date.get(Calendar.MONTH),
date.get(Calendar.DAY_OF_MONTH),
date.get(Calendar.HOUR_OF_DAY),
date.get(Calendar.MINUTE),
date.get(Calendar.SECOND));
d.set(Calendar.MILLISECOND, date.get(Calendar.MILLISECOND));
d.add(Calendar.MILLISECOND, d.get(d.ZONE_OFFSET));
d.add(Calendar.MILLISECOND, d.get(d.DST_OFFSET));
return convert(d);
}
private String convert(Calendar d) {
StringBuffer sb = new StringBuffer();
try {
sb.append(Text.zeroFill(d.get(Calendar.YEAR), 4));
sb.append("-");
sb.append(Text.zeroFill(d.get(Calendar.MONTH) + 1, 2));
sb.append("-");
sb.append(Text.zeroFill(d.get(Calendar.DAY_OF_MONTH), 2));
sb.append("-");
sb.append(Text.zeroFill(d.get(Calendar.HOUR_OF_DAY), 2));
sb.append(".");
sb.append(Text.zeroFill(d.get(Calendar.MINUTE), 2));
sb.append(".");
sb.append(Text.zeroFill(d.get(Calendar.SECOND), 2));
sb.append(".");
sb.append(Text.zeroFill(d.get(Calendar.MILLISECOND), 3));
sb.append("000");
} catch (Exception e) {
}
return sb.toString();
}
public static void main(String[] args) {
CustomDate date = new CustomDate("2009-03-08-10.01.01.198000", true);
System.out.println("Date : " + date);
System.out.println("Local: " + date.getLocalTime());
System.out.println("UTC : " + date.getUTCTime());
}
}
Thanks in Advance