]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fixed incorrect week numbers in DateField (#14437)
authorTeemu Pòˆntelin <teemu@vaadin.com>
Sun, 17 Aug 2014 20:24:28 +0000 (23:24 +0300)
committerVaadin Code Review <review@vaadin.com>
Wed, 20 Aug 2014 12:44:15 +0000 (12:44 +0000)
Daylight saving time caused problems with the week number calculation
in the DateTimeService.getISOWeekNumber(Date d) method. If the given
date was inside a DST period, there was a rounding error when calculating
the number of days from the beginning of the year. As a result the week
numbers were calculated incorrectly in a case where the year started with
a Thursday (like for example 2015 and 2026).

Change-Id: Ib3d045ea0b9a1acc44b6f28487b064b3c2b76bb9

client/src/com/vaadin/client/DateTimeService.java
client/tests/src/com/vaadin/client/DateTimeServiceTest.java

index bf57261c72914ead047a8bfd0f367f090db0fa1a..f4cfe7a278c888d65f21c91f63d95b738fb231ea 100644 (file)
@@ -281,7 +281,11 @@ public class DateTimeService {
 
         Date firstOfJanuary = new Date(nearestThursday.getYear(), 0, 1);
         long timeDiff = nearestThursday.getTime() - firstOfJanuary.getTime();
-        int daysSinceFirstOfJanuary = (int) (timeDiff / MILLISECONDS_PER_DAY);
+
+        // Rounding the result, as the division doesn't result in an integer
+        // when the given date is inside daylight saving time period.
+        int daysSinceFirstOfJanuary = (int) Math.round((double) timeDiff
+                / MILLISECONDS_PER_DAY);
 
         int weekNumber = (daysSinceFirstOfJanuary) / 7 + 1;
 
index 3f4828678fd2078ad3e5a1dd961aed0440c349c5..f9351d1cc0dca7bfba3186f18149e8067fd77bf5 100755 (executable)
@@ -48,6 +48,16 @@ public class DateTimeServiceTest extends TestCase {
         isoWeekNumbers.put(getDate(2010, 1, 4), 1);
         isoWeekNumbers.put(getDate(2010, 1, 5), 1);
         isoWeekNumbers.put(getDate(2010, 10, 10), 40);
+        isoWeekNumbers.put(getDate(2015, 3, 24), 13);
+        isoWeekNumbers.put(getDate(2015, 3, 31), 14);
+        isoWeekNumbers.put(getDate(2015, 10, 13), 42);
+        isoWeekNumbers.put(getDate(2015, 10, 20), 43);
+        isoWeekNumbers.put(getDate(2015, 10, 27), 44);
+        isoWeekNumbers.put(getDate(2026, 3, 24), 13);
+        isoWeekNumbers.put(getDate(2026, 3, 31), 14);
+        isoWeekNumbers.put(getDate(2026, 10, 13), 42);
+        isoWeekNumbers.put(getDate(2026, 10, 20), 43);
+        isoWeekNumbers.put(getDate(2026, 10, 27), 44);
 
     }