From: Michael Prager Date: Sun, 31 Oct 2010 18:29:08 +0000 (+0100) Subject: * fixed daylight saving times not being applied properly resulting in events being... X-Git-Url: https://code.delx.au/comingnext/commitdiff_plain/2de56af5f6389b2bf02d40ff58cfd2f2be40188e * fixed daylight saving times not being applied properly resulting in events being off by 1 day or hour * added option to change daylight saving offset --- diff --git a/Readme.txt b/Readme.txt index 3a22c3b..2472134 100644 --- a/Readme.txt +++ b/Readme.txt @@ -220,3 +220,8 @@ Changelog: - startup performance improvements - stylish default background image - first release available on Ovi Store +1.30 () by Michael Prager + - fixed an issue with daylight saving time not being used properly resulting + in events around time shifts to be off by one day or hour + - added option to change daylight saving offset (for time zones which have + more than a +1h time shift) diff --git a/comingNext/de.lproj/localizedTextStrings.js b/comingNext/de.lproj/localizedTextStrings.js index d20dc0e..50393be 100644 --- a/comingNext/de.lproj/localizedTextStrings.js +++ b/comingNext/de.lproj/localizedTextStrings.js @@ -65,8 +65,10 @@ localizedText['settings.info.showNothingText'] = 'wenn aktiviert, wird ein Text localizedText['settings.name.nothingText'] = '"Keine weiteren Ereignisse..." Text'; localizedText['settings.info.nothingText'] = 'Text, der gezeigt wird, wenn keine Ereignisse in der Liste sind'; localizedText['settings.default.nothingText'] = 'Keine weiteren Ereignisse in den nächsten %d Monaten'; -localizedText['settings.name.enableDaylightSaving'] = 'Aktiviere Zeitumstellung (+1h)'; +localizedText['settings.name.enableDaylightSaving'] = 'Aktiviere Zeitumstellung'; localizedText['settings.info.enableDaylightSaving'] = 'diese Einstellung sollte aktiviert werden, falls Sie in einer Zeitzone leben, in der die Uhren zwischen Sommer und Winter umgestellt werden'; +localizedText['settings.name.daylightSavingOffset'] = 'Zeitumstellungsoffset (in Stunden)'; +localizedText['settings.info.daylightSavingOffset'] = 'Anzahl der Stunden, um die die Uhr bei der Umstellung von Sommer- auf Winterzeit zurückgestellt wird. Diese Einstellung ist nur von Belang, falls die Zeitumstellung aktiviert ist. In Europa werden die Uhren in der Regel um 1 Stunde zurückgestellt.'; localizedText['settings.name.hideWidgetOnCalendarOpen'] = 'Schließe Widget beim Öffnen des Kalend.'; localizedText['settings.info.hideWidgetOnCalendarOpen'] = 'wenn aktiviert, wird das Widget geschlossen, sobald der Kalender aus dem Widget heraus gestartet wird'; localizedText['settings.name.cssStyle_background'] = '.background'; diff --git a/comingNext/fr.lproj/localizedTextStrings.js b/comingNext/fr.lproj/localizedTextStrings.js index f69ea3a..a39d582 100644 --- a/comingNext/fr.lproj/localizedTextStrings.js +++ b/comingNext/fr.lproj/localizedTextStrings.js @@ -67,6 +67,8 @@ localizedText['settings.info.nothingText'] = 'Texte à afficher quand il n localizedText['settings.default.nothingText'] = 'Pas d\'événements durant les prochains mois'; localizedText['settings.name.enableDaylightSaving'] = 'Activé Daylight Saving'; localizedText['settings.info.enableDaylightSaving'] = 'Permet d\'activer Daylight saving si vous êtes dans une fuseau horaire où il y a daylight saving time (+1h)'; +localizedText['settings.name.daylightSavingOffset'] = 'Daylight Saving Offset (hours)'; +localizedText['settings.info.daylightSavingOffset'] = 'Number of hours your clock is shifted by daylight saving time. This setting is only relevant if daylight saving has been enabled. The default offset in europe is 1 hour.'; localizedText['settings.name.hideWidgetOnCalendarOpen'] = 'Hide Widget When Opening Calendar'; localizedText['settings.info.hideWidgetOnCalendarOpen'] = 'enable this if the fullscreen widget should be hidden when clicking on the widget to open the calendar app'; localizedText['settings.name.cssStyle_background'] = '.background'; diff --git a/comingNext/index.html b/comingNext/index.html index 372489b..d66fd29 100644 --- a/comingNext/index.html +++ b/comingNext/index.html @@ -47,6 +47,7 @@ var config = { showNothingText: { Type: 'Bool', Default: true, Value: true,}, nothingText: { Type: 'String', Default: getLocalizedText('settings.default.nothingText'), Value: getLocalizedText('settings.default.nothingText'),}, enableDaylightSaving: { Type: 'Bool', Default: true, Value: true,}, + daylightSavingOffset: { Type: 'Int', Default: 1, Value: 1,}, hideWidgetOnCalendarOpen: { Type: 'Bool', Default: false, Value: false,}, cssStyle_background: { Type: 'String', Default: 'color:#ffffff; background-color:#000000', Value: 'color:#ffffff; background-color:#000000',}, cssStyle_backgroundFullscreen: { Type: 'String', Default: 'color:#ffffff; background-color:#000000', Value: 'color:#ffffff; background-color:#000000',}, @@ -83,9 +84,8 @@ var notificationRequest2; var calendarList = []; // vars for daylight saving time -var daylightsavingWinter = 0; -var daylightsavingSummer = 0; -var summertime = false; +var summertime = false; // true, if current date is in summer, false if in winter +var daylightSavingDates = new Object(); // caches calculated DST winter and summer time shift dates // this is a list of data fields a calendar event can have var entryFields = [ @@ -127,43 +127,48 @@ function subToSunday(myDate, year, days, prevMonthDays) days = isLeapYear(year) ? --days : days; return days; } - -function calcDaylightSaving() + +function isSummertime(curDate) { - var thisYearS = new Date(now.getFullYear(), 3, 0, 0, 0, 0 ); - var thisYearW = new Date(now.getFullYear(), 10, 0, 0, 0, 0 ); - var nextYearS = new Date(now.getFullYear() + 1, 3, 0, 0, 0, 0 ); - var nextYearW = new Date(now.getFullYear() + 1, 10, 0, 0, 0, 0 ); var summer = false; var winter = false; - - thisYearSDays = nextYearSDays = 90; - thisYearWDays = nextYearWDays = 304; - - thisYearSDays = calcLeapYear(now.getFullYear(), thisYearSDays); - thisYearWDays = calcLeapYear(now.getFullYear(), thisYearWDays); - nextYearSDays = calcLeapYear(now.getFullYear() + 1, nextYearSDays); - nextYearWDays = calcLeapYear(now.getFullYear() + 1, nextYearWDays); - - thisYearSDays = subToSunday(thisYearS, now.getFullYear(), thisYearSDays, 59); - thisYearWDays = subToSunday(thisYearW, now.getFullYear(), thisYearWDays, 273); - nextYearSDays = subToSunday(nextYearS, now.getFullYear() + 1, nextYearSDays, 59); - nextYearWDays = subToSunday(nextYearW, now.getFullYear() + 1, nextYearWDays, 273); - - daylightsavingSummer = new Date (now.getFullYear(), 03-1, thisYearSDays, 2, 0, 0); - daylightsavingWinter = new Date (now.getFullYear(), 10-1, thisYearWDays, 2, 0, 0); - if (daylightsavingSummer < now) { - daylightsavingSummer = new Date (now.getFullYear()+1, 03-1, nextYearSDays, 2, 0, 0); - var summer = true; - } - if (daylightsavingWinter < now) { - daylightsavingWinter = new Date (now.getFullYear()+1, 10-1, nextYearWDays, 2, 0, 0); - var winter = true; + + // if we already calculated DST summer and winter time dates for this year, use cached values + var dst = daylightSavingDates[curDate.getFullYear()]; + if (!dst) { + var thisYearS = new Date(curDate.getFullYear(), 3, 0, 0, 0, 0 ); + var thisYearW = new Date(curDate.getFullYear(), 10, 0, 0, 0, 0 ); + var nextYearS = new Date(curDate.getFullYear() + 1, 3, 0, 0, 0, 0 ); + var nextYearW = new Date(curDate.getFullYear() + 1, 10, 0, 0, 0, 0 ); + + thisYearSDays = nextYearSDays = 90; + thisYearWDays = nextYearWDays = 304; + + thisYearSDays = calcLeapYear(curDate.getFullYear(), thisYearSDays); + thisYearWDays = calcLeapYear(curDate.getFullYear(), thisYearWDays); + nextYearSDays = calcLeapYear(curDate.getFullYear() + 1, nextYearSDays); + nextYearWDays = calcLeapYear(curDate.getFullYear() + 1, nextYearWDays); + + thisYearSDays = subToSunday(thisYearS, curDate.getFullYear(), thisYearSDays, 59); + thisYearWDays = subToSunday(thisYearW, curDate.getFullYear(), thisYearWDays, 273); + nextYearSDays = subToSunday(nextYearS, curDate.getFullYear() + 1, nextYearSDays, 59); + nextYearWDays = subToSunday(nextYearW, curDate.getFullYear() + 1, nextYearWDays, 273); + + dst = { + Summer: new Date (curDate.getFullYear(), 03-1, thisYearSDays, 2, 0, 0), + Winter: new Date (curDate.getFullYear(), 10-1, thisYearWDays, 2, 0, 0), + } + daylightSavingDates[curDate.getFullYear()] = dst; } + + if (dst.Summer < curDate) + summer = true; + if (dst.Winter < curDate) + winter = true; if (summer && !winter) - summertime = true; + return true; else - summertime = false; + return false; } function error(message) @@ -382,18 +387,26 @@ function parseDate(dateString) if (dateArr.length == 6 && dateArr[5].toLowerCase() == 'am' && hours == 12) hours = 0; - console.info('year=' + year + ' month=' + month + ' day=' + day + ' hours=' + hours + ' minutes=' + minutes+ ' seconds=' + seconds); - + var result = new Date(year, month - 1, day, hours, minutes, seconds); + // take care of daylight saving time if (config['enableDaylightSaving'].Value) { - var date = new Date(year, month - 1, day, hours, minutes, seconds); - if (summertime && date > daylightsavingWinter && date < daylightsavingSummer) - hours -= 1; - else if (!summertime && date > daylightsavingSummer && date < daylightsavingWinter) - hours += 1; + + // determine if date is in summer or winter time + var dateSummerTime = isSummertime(result); + + // work around bug in Nokias calendar api resulting in dates within a different DST to be off by 1 hour + if (summertime && !dateSummerTime) { + result = new Date(result.getTime() - 1000 * 60 * 60 * config['daylightSavingOffset'].Value); // -1 hour + console.info('parseDate(): fixing time -1h: ' + result); + } + else if (!summertime && dateSummerTime) { + result = new Date(result.getTime() + 1000 * 60 * 60 * config['daylightSavingOffset'].Value); // +1 hour + console.info('parseDate(): fixing time +1h: ' + result); + } } - return new Date(year, month - 1, day, hours, minutes, seconds); + return result; } // returns a short date as string ("31.12" or "12.31") based on the format string which should look like "Wednesday, 26 August, 2009 12:00:00 am" @@ -467,11 +480,11 @@ function formatTime(date) function updateData() { console.info('updateData()'); - calcDaylightSaving(); try { // meetings have time // note: anniveraries have a start time of 12:00am. So since we want to include them, we have to query the whole day and check if events have passed later now = new Date(); + summertime = isSummertime(now); // cache summer time info for today var meetingList = []; for(var i=0; i < calendarList.length; i++) { var meetingListFiltering = { diff --git a/comingNext/localizedTextStrings.js b/comingNext/localizedTextStrings.js index c22111d..ef221f9 100644 --- a/comingNext/localizedTextStrings.js +++ b/comingNext/localizedTextStrings.js @@ -65,8 +65,10 @@ localizedText['settings.info.showNothingText'] = 'if enabled, show a text if no localizedText['settings.name.nothingText'] = '"No further events..." Text'; localizedText['settings.info.nothingText'] = 'text to show when no events are in the list'; localizedText['settings.default.nothingText'] = 'No further events within %d months'; -localizedText['settings.name.enableDaylightSaving'] = 'Enable Daylight Saving (+1h)'; -localizedText['settings.info.enableDaylightSaving'] = 'enable this if you are in a timezone that has daylight saving time (+1h)'; +localizedText['settings.name.enableDaylightSaving'] = 'Enable Daylight Saving'; +localizedText['settings.info.enableDaylightSaving'] = 'enable this if you are in a timezone that has daylight saving time'; +localizedText['settings.name.daylightSavingOffset'] = 'Daylight Saving Offset (hours)'; +localizedText['settings.info.daylightSavingOffset'] = 'Number of hours your clock is shifted by daylight saving time. This setting is only relevant if daylight saving has been enabled. The default offset in europe is 1 hour.'; localizedText['settings.name.hideWidgetOnCalendarOpen'] = 'Hide Widget When Opening Calendar'; localizedText['settings.info.hideWidgetOnCalendarOpen'] = 'enable this if the fullscreen widget should be hidden when clicking on the widget to open the calendar app'; localizedText['settings.name.cssStyle_background'] = '.background'; diff --git a/comingNext/pt-BR.lproj/localizedTextStrings.js b/comingNext/pt-BR.lproj/localizedTextStrings.js index 634baae..67e7908 100644 --- a/comingNext/pt-BR.lproj/localizedTextStrings.js +++ b/comingNext/pt-BR.lproj/localizedTextStrings.js @@ -65,8 +65,10 @@ localizedText['settings.info.showNothingText'] = 'se ativo, apresenta um texto s localizedText['settings.name.nothingText'] = '"Não há mais eventos..." Texto'; localizedText['settings.info.nothingText'] = 'texto apresentado quando não há eventos listados'; localizedText['settings.default.nothingText'] = 'Não há mais eventos nestes %d meses'; -localizedText['settings.name.enableDaylightSaving'] = 'Ativa horário de verão (+1h)'; -localizedText['settings.info.enableDaylightSaving'] = 'ative isto se você está em uma região que tem horário de verão (+1h)'; +localizedText['settings.name.enableDaylightSaving'] = 'Ativa horário de verão'; +localizedText['settings.info.enableDaylightSaving'] = 'ative isto se você está em uma região que tem horário de verão'; +localizedText['settings.name.daylightSavingOffset'] = 'Daylight Saving Offset (hours)'; +localizedText['settings.info.daylightSavingOffset'] = 'Number of hours your clock is shifted by daylight saving time. This setting is only relevant if daylight saving has been enabled. The default offset in europe is 1 hour.'; localizedText['settings.name.hideWidgetOnCalendarOpen'] = 'Esconde o Widget quando abrir o Calendário'; localizedText['settings.info.hideWidgetOnCalendarOpen'] = 'ative isto se se o widget em tela cheia deverá ficar escondido após clicado para abrir a aplicação de calendário'; localizedText['settings.name.cssStyle_background'] = '.background'; diff --git a/comingNext/ru.lproj/localizedTextStrings.js b/comingNext/ru.lproj/localizedTextStrings.js index 8f6b9bc..238bfc9 100644 --- a/comingNext/ru.lproj/localizedTextStrings.js +++ b/comingNext/ru.lproj/localizedTextStrings.js @@ -65,8 +65,10 @@ localizedText['settings.info.showNothingText'] = 'показывает текс localizedText['settings.name.nothingText'] = 'Текст "Нет будущих событий..."'; localizedText['settings.info.nothingText'] = 'показывает текст когда нет записей в календаре'; localizedText['settings.default.nothingText'] = 'Нет будущих событий в %d месяце'; -localizedText['settings.name.enableDaylightSaving'] = 'Включить летнее время (+1ч)'; -localizedText['settings.info.enableDaylightSaving'] = 'задает летнее время (+1ч), иначе зимнее время'; +localizedText['settings.name.enableDaylightSaving'] = 'Включить летнее время'; +localizedText['settings.info.enableDaylightSaving'] = 'задает летнее время, иначе зимнее время'; +localizedText['settings.name.daylightSavingOffset'] = 'Daylight Saving Offset (hours)'; +localizedText['settings.info.daylightSavingOffset'] = 'Number of hours your clock is shifted by daylight saving time. This setting is only relevant if daylight saving has been enabled. The default offset in europe is 1 hour.'; localizedText['settings.name.hideWidgetOnCalendarOpen'] = 'Скрывать виджет когда запущен календарь'; localizedText['settings.info.hideWidgetOnCalendarOpen'] = 'виджет будет скрыт при запуске календаря, иначе выводиться всегда'; localizedText['settings.name.cssStyle_background'] = '.background';