@@ -30,11 +30,16 @@ var settings = require("Storage").readJSON("agenda.settings.json",true)||{};
30
30
31
31
CALENDAR = CALENDAR . sort ( ( a , b ) => a . timestamp - b . timestamp ) ;
32
32
33
- function getDate ( timestamp ) {
34
- return new Date ( timestamp * 1000 ) ;
33
+ function getDate ( timestamp , allDay ) {
34
+ // All day events are always in UTC and always start at 00:00:00, so we
35
+ // need to "undo" the timezone offsetting to make sure that the day is
36
+ // correct.
37
+ var offset = allDay ? new Date ( ) . getTimezoneOffset ( ) * 60 : 0
38
+ return new Date ( ( timestamp + offset ) * 1000 ) ;
35
39
}
40
+
36
41
function formatDay ( date ) {
37
- let formattedDate = Locale . dow ( date , 1 ) + " " + Locale . date ( date ) . replace ( / \d \d \d \d / , "" ) ;
42
+ let formattedDate = Locale . dow ( date , 1 ) + " " + Locale . date ( date ) . replace ( / , * \s * \d \d \d \d / , "" ) ;
38
43
if ( ! settings . useToday ) {
39
44
return formattedDate ;
40
45
}
@@ -57,8 +62,9 @@ function formatDateLong(date, includeDay, allDay) {
57
62
}
58
63
return shortTime ;
59
64
}
65
+
60
66
function formatDateShort ( date , allDay ) {
61
- return formatDay ( date ) + ( allDay ?"" :Locale . time ( date , 1 ) + Locale . meridian ( date ) ) ;
67
+ return formatDay ( date ) + ( allDay ?"" :" " + Locale . time ( date , 1 ) + Locale . meridian ( date ) ) ;
62
68
}
63
69
64
70
var lines = [ ] ;
@@ -69,16 +75,19 @@ function showEvent(ev) {
69
75
//var lines = [];
70
76
if ( ev . title ) lines = g . wrapString ( ev . title , g . getWidth ( ) - 10 ) ;
71
77
var titleCnt = lines . length ;
72
- var start = getDate ( ev . timestamp ) ;
73
- var end = getDate ( ( + ev . timestamp ) + ( + ev . durationInSeconds ) ) ;
78
+ var start = getDate ( ev . timestamp , ev . allDay ) ;
79
+ // All day events end at the midnight boundary of the following day. Here, we
80
+ // subtract one second for all day events so the days display correctly.
81
+ const allDayEndCorrection = ev . allDay ? 1 : 0 ;
82
+ var end = getDate ( ( + ev . timestamp ) + ( + ev . durationInSeconds ) - allDayEndCorrection , ev . allDay ) ;
74
83
var includeDay = true ;
75
84
if ( titleCnt ) lines . push ( "" ) ; // add blank line after title
76
85
if ( start . getDay ( ) == end . getDay ( ) && start . getMonth ( ) == end . getMonth ( ) )
77
86
includeDay = false ;
78
- if ( includeDay && ev . allDay ) {
79
- //single day all day (average to avoid getting previous day)
87
+ if ( ! includeDay && ev . allDay ) {
88
+ //single day all day
80
89
lines = lines . concat (
81
- g . wrapString ( formatDateLong ( new Date ( ( start + end ) / 2 ) , includeDay , ev . allDay ) , g . getWidth ( ) - 10 ) ) ;
90
+ g . wrapString ( formatDateLong ( start , includeDay , ev . allDay ) , g . getWidth ( ) - 10 ) ) ;
82
91
} else if ( includeDay || ev . allDay ) {
83
92
lines = lines . concat (
84
93
/*LANG*/ "Start" + ":" ,
@@ -137,7 +146,7 @@ function showList() {
137
146
if ( ! ev ) return ;
138
147
var isPast = false ;
139
148
var x = r . x + 2 , title = ev . title ;
140
- var body = formatDateShort ( getDate ( ev . timestamp ) , ev . allDay ) + "\n" + ( ev . location ?ev . location :/*LANG*/ "No location" ) ;
149
+ var body = formatDateShort ( getDate ( ev . timestamp , ev . allDay ) , ev . allDay ) + "\n" + ( ev . location ?ev . location :/*LANG*/ "No location" ) ;
141
150
if ( settings . pastEvents ) isPast = ev . timestamp + ev . durationInSeconds < ( new Date ( ) ) / 1000 ;
142
151
if ( title ) g . setFontAlign ( - 1 , - 1 ) . setFont ( fontBig )
143
152
. setColor ( isPast ? "#888" : g . theme . fg ) . drawString ( title , x + 4 , r . y + 2 ) ;
0 commit comments