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() {