The core of the problem is that I am incorrectly storing bank holiday start points in epoch seconds based on UTC0. Of course they actualy start at localtime == 00:00:00. I think I need to revise the code to store bank hols as (YYYY-1900):MM:DD, then compare to the appropriate fields of locatime($epoch).
original node updated with fixed code.
Cheers, R.
Pereant, qui ante nos nostra dixerunt!
| [reply] [d/l] |
You either need a mktime that is time zone aware (POSIX::mktime seems to know about DST but not about time zones), or an UTC variant, e.g. Time::timegm. Of course, the logic of $today instead of time needs to be applied, anyway. (I tried it out, seems to work)
In the tests, the first date (from the future) kills too many holidays :-) (you should either sort the test data before the test, or create a new ooh() when time traveling)
Update: The easiest fix would have been (in the originally posted version):
my $today = POSIX::mktime(0,0,0,(localtime)[3..5]);
while (<DATA>) { # read bank holiday file
...
| [reply] [d/l] [select] |
Even after working out $today in epoch, I still had the problem that I was storing bank hols as epoch. I would also need to look at each bank hol, and apply correct daylight saving time, before I could correctly establish its epoch start. I realised it was much easier to store bank hols as yyy:MM:DD and look at the date from localtime when I flip.
I found another edge case around the transitions between saving/non saving. This could be bad as I may be treating alerts as OOH for an hour when the clocks go forward. I have added the following code to the main node to fix this
$valid = POSIX::mktime(@start, $date, $mnth, $yr);
$valid += $add * (24*60*60);
# Check for daylight savings adjustment
my $dst = $start[2] - +(localtime $valid)[2];
$valid += $dst * 60 * 60; my $now = time;
Cheers, R.
Pereant, qui ante nos nostra dixerunt!
| [reply] [d/l] [select] |