Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re: efficient determination of in/out of hours

by soonix (Vicar)
on Oct 17, 2013 at 13:52 UTC ( #1058632=note: print w/ replies, xml ) Need Help??


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

next if $bh_start < time; # history
If the program ist started on a holiday (even 1 second past midnight), the routine will think it is a workday... I wanted to propose
... use integer; my $today = time / 86400 * 86400; # chop hours, minutes, seconds while (<DATA>) { # read bank holiday file ... next if $bh_start < $today; # history ... } ...
but this doesn't work correctly, either, because time is in seconds since some 1970-01-01 UTC...


Comment on Re: efficient determination of in/out of hours
Download Code
Replies are listed 'Best First'.
Re^2: efficient determination of in/out of hours
by Random_Walk (Parson) on Oct 17, 2013 at 15:45 UTC

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

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1058632]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (7)
As of 2015-07-30 11:11 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (271 votes), past polls