Fix bug that caused reminders to keep repeating every few seconds

Fixes #351
pull/348/head
Alinson S. Xavier 8 years ago
parent 7bb88dcb97
commit 16f20d50a0

@ -42,8 +42,7 @@ public abstract class DateUtils
public static long applyTimezone(long localTimestamp)
{
TimeZone tz = getTimezone();
long now = new Date(localTimestamp).getTime();
return now - tz.getOffset(now);
return localTimestamp - tz.getOffset(localTimestamp - tz.getOffset(localTimestamp));
}
public static String formatHeaderDate(GregorianCalendar day)
@ -230,8 +229,7 @@ public abstract class DateUtils
public static long removeTimezone(long timestamp)
{
TimeZone tz = getTimezone();
long now = new Date(timestamp).getTime();
return now + tz.getOffset(now);
return timestamp + tz.getOffset(timestamp);
}
public static void setFixedLocalTime(Long timestamp)

@ -58,4 +58,11 @@ public class BaseUnitTest
cal.set(year, month, day);
return cal.getTimeInMillis();
}
public long timestamp(int year, int month, int day, int hourOfDay, int minute, int second)
{
GregorianCalendar cal = DateUtils.getStartOfTodayCalendar();
cal.set(year, month, day, hourOfDay, minute, second);
return cal.getTimeInMillis();
}
}

@ -25,8 +25,11 @@ import org.junit.*;
import java.util.*;
import static java.util.Calendar.*;
import static junit.framework.Assert.assertEquals;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.MatcherAssert.*;
import static org.isoron.uhabits.utils.DateUtils.applyTimezone;
import static org.isoron.uhabits.utils.DateUtils.removeTimezone;
public class DateUtilsTest extends BaseUnitTest
{
@ -147,4 +150,86 @@ public class DateUtilsTest extends BaseUnitTest
assertThat(DateUtils.getDaysBetween(t1, t3), equalTo(365));
assertThat(DateUtils.getDaysBetween(t3, t1), equalTo(365));
}
@Test
public void test_applyTimezone()
{
DateUtils.setFixedTimeZone(TimeZone.getTimeZone("Australia/Sydney"));
assertEquals(applyTimezone(timestamp(2017, JULY, 30, 18, 0, 0)), (timestamp(2017, JULY, 30, 8, 0, 0)));
assertEquals(applyTimezone(timestamp(2017, SEPTEMBER, 30, 0, 0, 0)), (timestamp(2017, SEPTEMBER, 29, 14, 0, 0)));
assertEquals(applyTimezone(timestamp(2017, SEPTEMBER, 30, 10, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 0, 0, 0)));
assertEquals(applyTimezone(timestamp(2017, SEPTEMBER, 30, 11, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 1, 0, 0)));
assertEquals(applyTimezone(timestamp(2017, SEPTEMBER, 30, 12, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 2, 0, 0)));
assertEquals(applyTimezone(timestamp(2017, SEPTEMBER, 30, 13, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 3, 0, 0)));
assertEquals(applyTimezone(timestamp(2017, SEPTEMBER, 30, 22, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 12, 0, 0)));
assertEquals(applyTimezone(timestamp(2017, SEPTEMBER, 30, 23, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 13, 0, 0)));
assertEquals(applyTimezone(timestamp(2017, OCTOBER, 1, 0, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 14, 0, 0)));
assertEquals(applyTimezone(timestamp(2017, OCTOBER, 1, 1, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 15, 0, 0)));
assertEquals(applyTimezone(timestamp(2017, OCTOBER, 1, 1, 59, 0)), (timestamp(2017, SEPTEMBER, 30, 15, 59, 0)));
// DST begins
assertEquals(applyTimezone(timestamp(2017, OCTOBER, 1, 3, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 16, 0, 0)));
assertEquals(applyTimezone(timestamp(2017, OCTOBER, 1, 4, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 17, 0, 0)));
assertEquals(applyTimezone(timestamp(2017, OCTOBER, 1, 5, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 18, 0, 0)));
assertEquals(applyTimezone(timestamp(2017, OCTOBER, 1, 11, 0, 0)), (timestamp(2017, OCTOBER, 1, 0, 0, 0)));
assertEquals(applyTimezone(timestamp(2017, OCTOBER, 1, 12, 0, 0)), (timestamp(2017, OCTOBER, 1, 1, 0, 0)));
assertEquals(applyTimezone(timestamp(2017, OCTOBER, 1, 13, 0, 0)), (timestamp(2017, OCTOBER, 1, 2, 0, 0)));
assertEquals(applyTimezone(timestamp(2017, OCTOBER, 1, 14, 0, 0)), (timestamp(2017, OCTOBER, 1, 3, 0, 0)));
assertEquals(applyTimezone(timestamp(2017, OCTOBER, 1, 15, 0, 0)), (timestamp(2017, OCTOBER, 1, 4, 0, 0)));
assertEquals(applyTimezone(timestamp(2017, OCTOBER, 1, 19, 0, 0)), (timestamp(2017, OCTOBER, 1, 8, 0, 0)));
assertEquals(applyTimezone(timestamp(2017, OCTOBER, 2, 19, 0, 0)), (timestamp(2017, OCTOBER, 2, 8, 0, 0)));
assertEquals(applyTimezone(timestamp(2017, NOVEMBER, 30, 19, 0, 0)), (timestamp(2017, NOVEMBER, 30, 8, 0, 0)));
assertEquals(applyTimezone(timestamp(2018, MARCH, 31, 0, 0, 0)), (timestamp(2018, MARCH, 30, 13, 0, 0)));
assertEquals(applyTimezone(timestamp(2018, MARCH, 31, 12, 0, 0)), (timestamp(2018, MARCH, 31, 1, 0, 0)));
assertEquals(applyTimezone(timestamp(2018, MARCH, 31, 18, 0, 0)), (timestamp(2018, MARCH, 31, 7, 0, 0)));
assertEquals(applyTimezone(timestamp(2018, APRIL, 1, 0, 0, 0)), (timestamp(2018, MARCH, 31, 13, 0, 0)));
assertEquals(applyTimezone(timestamp(2018, APRIL, 1, 1, 0, 0)), (timestamp(2018, MARCH, 31, 14, 0, 0)));
assertEquals(applyTimezone(timestamp(2018, APRIL, 1, 1, 59, 0)), (timestamp(2018, MARCH, 31, 14, 59, 0)));
// DST ends
assertEquals(applyTimezone(timestamp(2018, APRIL, 1, 2, 0, 0)), (timestamp(2018, MARCH, 31, 16, 0, 0)));
assertEquals(applyTimezone(timestamp(2018, APRIL, 1, 3, 0, 0)), (timestamp(2018, MARCH, 31, 17, 0, 0)));
assertEquals(applyTimezone(timestamp(2018, APRIL, 1, 4, 0, 0)), (timestamp(2018, MARCH, 31, 18, 0, 0)));
assertEquals(applyTimezone(timestamp(2018, APRIL, 1, 10, 0, 0)), (timestamp(2018, APRIL, 1, 0, 0, 0)));
assertEquals(applyTimezone(timestamp(2018, APRIL, 1, 18, 0, 0)), (timestamp(2018, APRIL, 1, 8, 0, 0)));
}
@Test
public void test_removeTimezone()
{
DateUtils.setFixedTimeZone(TimeZone.getTimeZone("Australia/Sydney"));
assertEquals(removeTimezone(timestamp(2017, JULY, 30, 8, 0, 0)), (timestamp(2017, JULY, 30, 18, 0, 0)));
assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 29, 14, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 0, 0, 0)));
assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 30, 0, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 10, 0, 0)));
assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 30, 1, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 11, 0, 0)));
assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 30, 2, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 12, 0, 0)));
assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 30, 3, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 13, 0, 0)));
assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 30, 12, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 22, 0, 0)));
assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 30, 13, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 23, 0, 0)));
assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 30, 14, 0, 0)), (timestamp(2017, OCTOBER, 1, 0, 0, 0)));
assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 30, 15, 0, 0)), (timestamp(2017, OCTOBER, 1, 1, 0, 0)));
assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 30, 15, 59, 0)), (timestamp(2017, OCTOBER, 1, 1, 59, 0)));
// DST begins
assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 30, 16, 0, 0)), (timestamp(2017, OCTOBER, 1, 3, 0, 0)));
assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 30, 17, 0, 0)), (timestamp(2017, OCTOBER, 1, 4, 0, 0)));
assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 30, 18, 0, 0)), (timestamp(2017, OCTOBER, 1, 5, 0, 0)));
assertEquals(removeTimezone(timestamp(2017, OCTOBER, 1, 0, 0, 0)), (timestamp(2017, OCTOBER, 1, 11, 0, 0)));
assertEquals(removeTimezone(timestamp(2017, OCTOBER, 1, 1, 0, 0)), (timestamp(2017, OCTOBER, 1, 12, 0, 0)));
assertEquals(removeTimezone(timestamp(2017, OCTOBER, 1, 2, 0, 0)), (timestamp(2017, OCTOBER, 1, 13, 0, 0)));
assertEquals(removeTimezone(timestamp(2017, OCTOBER, 1, 3, 0, 0)), (timestamp(2017, OCTOBER, 1, 14, 0, 0)));
assertEquals(removeTimezone(timestamp(2017, OCTOBER, 1, 4, 0, 0)), (timestamp(2017, OCTOBER, 1, 15, 0, 0)));
assertEquals(removeTimezone(timestamp(2017, OCTOBER, 1, 8, 0, 0)), (timestamp(2017, OCTOBER, 1, 19, 0, 0)));
assertEquals(removeTimezone(timestamp(2017, OCTOBER, 2, 8, 0, 0)), (timestamp(2017, OCTOBER, 2, 19, 0, 0)));
assertEquals(removeTimezone(timestamp(2017, NOVEMBER, 30, 8, 0, 0)), (timestamp(2017, NOVEMBER, 30, 19, 0, 0)));
assertEquals(removeTimezone(timestamp(2018, MARCH, 30, 13, 0, 0)), (timestamp(2018, MARCH, 31, 0, 0, 0)));
assertEquals(removeTimezone(timestamp(2018, MARCH, 31, 1, 0, 0)), (timestamp(2018, MARCH, 31, 12, 0, 0)));
assertEquals(removeTimezone(timestamp(2018, MARCH, 31, 7, 0, 0)), (timestamp(2018, MARCH, 31, 18, 0, 0)));
assertEquals(removeTimezone(timestamp(2018, MARCH, 31, 13, 0, 0)), (timestamp(2018, APRIL, 1, 0, 0, 0)));
assertEquals(removeTimezone(timestamp(2018, MARCH, 31, 14, 0, 0)), (timestamp(2018, APRIL, 1, 1, 0, 0)));
assertEquals(removeTimezone(timestamp(2018, MARCH, 31, 14, 59, 0)), (timestamp(2018, APRIL, 1, 1, 59, 0)));
// DST ends
assertEquals(removeTimezone(timestamp(2018, MARCH, 31, 16, 0, 0)), (timestamp(2018, APRIL, 1, 2, 0, 0)));
assertEquals(removeTimezone(timestamp(2018, MARCH, 31, 17, 0, 0)), (timestamp(2018, APRIL, 1, 3, 0, 0)));
assertEquals(removeTimezone(timestamp(2018, MARCH, 31, 18, 0, 0)), (timestamp(2018, APRIL, 1, 4, 0, 0)));
assertEquals(removeTimezone(timestamp(2018, APRIL, 1, 0, 0, 0)), (timestamp(2018, APRIL, 1, 10, 0, 0)));
assertEquals(removeTimezone(timestamp(2018, APRIL, 1, 8, 0, 0)), (timestamp(2018, APRIL, 1, 18, 0, 0)));
}
}

Loading…
Cancel
Save