in reply to Re: efficient determination of in/out of hours
in thread efficient determination of in/out of hours including Bank Holidays

Nice catch, thanks. Perhaps something like this will fix it

my $now = time; my $today = $now - ($now % 86400); while (<DATA>) { # read bank holiday file ... next if $bh_start < $today; # history ... } ...

I gotta run home now, will test it really works later

Update

Sadly it does not work. It looks lie POSIX mktime is based on GMT, localtime, of course is not. I added the above change, plus a bit of printing and a bank holiday for today (localtime now: 2116, GMT 2016) running the code it does skip todays bank hol (17th Oct 2013)

start of day (epoch based):Thu Oct 17 01:00:00 2013 Bank Hols Mon Oct 21 00:00:00 2013 Mon Feb 3 00:00:00 2014

Is there a better way to get timezone offset than to mktime for epoch + 1 day and comapare to localtime for the same? Can I trust the environment, or is there a magic Perl var?

Cheers,
R.

Pereant, qui ante nos nostra dixerunt!

Replies are listed 'Best First'.
Re^3: efficient determination of in/out of hours
by soonix (Chancellor) on Oct 17, 2013 at 20:39 UTC
    That's mathematically the same. (If 86400 were a power of 2, the most efficient way 'd be >> and <<.) However time and mktime refer to different timezones. Unless you happen to be in Iceland, there are some hours when this works wrong...
    Update: I posted this while you updated your post :-)
    I'm not at my computer, but perhaps something like mktime(gmtime) for determining today's midnight could work...

      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!

        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 ...