Date can add an hour to the day before Daylight Saving. http://gwt-code-reviews.appspot.com/174801 Review by: rice@google.com git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@7705 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/super/com/google/gwt/emul/java/util/Date.java b/user/super/com/google/gwt/emul/java/util/Date.java index 918b5d2..7701124 100644 --- a/user/super/com/google/gwt/emul/java/util/Date.java +++ b/user/super/com/google/gwt/emul/java/util/Date.java
@@ -229,7 +229,8 @@ public native void setMinutes(int minutes) /*-{ this.@java.util.Date::checkJsDate()(); - var hours = this.@java.util.Date::jsdate.getHours() + minutes / 60; + // Truncate (minutes / 60) to int. + var hours = this.@java.util.Date::jsdate.getHours() + ~~(minutes / 60); this.@java.util.Date::jsdate.setMinutes(minutes); this.@java.util.Date::fixDaylightSavings(I)(hours); }-*/; @@ -243,7 +244,8 @@ public native void setSeconds(int seconds) /*-{ this.@java.util.Date::checkJsDate()(); - var hours = this.@java.util.Date::jsdate.getHours() + seconds / (60 * 60); + // Truncate (seconds / (60 * 60)) to int. + var hours = this.@java.util.Date::jsdate.getHours() + ~~(seconds / (60 * 60)); this.@java.util.Date::jsdate.setSeconds(seconds); this.@java.util.Date::fixDaylightSavings(I)(hours); }-*/; @@ -348,7 +350,9 @@ d.setDate(d.getDate() + 1); var loff = d.getTimezoneOffset(); var timeDiff = noff - loff; - + var timeDiffHours = ~~(timeDiff / 60); + var timeDiffMinutes = timeDiff % 60; + // If the time zone offset is changing, advance the hours and // minutes from the initially requested time by the change amount if (timeDiff > 0) { @@ -358,12 +362,12 @@ var badHours = this.@java.util.Date::jsdate.getHours(); var minute = this.@java.util.Date::jsdate.getMinutes(); var second = this.@java.util.Date::jsdate.getSeconds(); - if (badHours + timeDiff / 60 >= 24) { + if (badHours + timeDiffHours >= 24) { day++; } var newTime = new Date(year, month, day, - hours + timeDiff / 60, - minute + timeDiff % 60, second); + hours + timeDiffHours, + minute + timeDiffMinutes, second); this.@java.util.Date::jsdate.setTime(newTime.getTime()); } }
diff --git a/user/test/com/google/gwt/emultest/java/util/DateTest.java b/user/test/com/google/gwt/emultest/java/util/DateTest.java index 65f4671..54bdda3 100644 --- a/user/test/com/google/gwt/emultest/java/util/DateTest.java +++ b/user/test/com/google/gwt/emultest/java/util/DateTest.java
@@ -143,6 +143,39 @@ } } + /** + * Tests that if daylight savings time occurs tomorrow, the current date isn't + * affected. + */ + public void testClockForwardNextDay() { + int[] monthDayHour = new int[3]; + if (!findClockForwardTime(2009, monthDayHour)) { + return; + } + + int month = monthDayHour[0]; + int day = monthDayHour[1] - 1; // Day before. + int hour = monthDayHour[2]; + Date d = new Date(2009 - 1900, month, day, hour, 0, 0); + assertEquals(day, d.getDate()); + assertEquals(hour, d.getHours()); + + // Change the minutes, which triggers fixDaylightSavings. + d.setMinutes(10); + assertEquals(day, d.getDate()); + assertEquals(hour, d.getHours()); + + // Change the seconds, which triggers fixDaylightSavings. + d.setSeconds(10); + assertEquals(day, d.getDate()); + assertEquals(hour, d.getHours()); + + // Change the minutes by more than an hour. + d.setMinutes(80); + assertEquals(day, d.getDate()); + assertEquals(hour + 1, d.getHours()); + } + /** Testing for public java.lang.Object java.util.Date.clone(). */ public void testClone() {