Maplat

 view release on metacpan or  search on metacpan

lib/Maplat/Helpers/DateStrings.pm  view on Meta::CPAN

package Maplat::Helpers::DateStrings;
use strict;
use warnings;

use 5.008000;
use Maplat::Helpers::Padding qw(doFPad);

use Date::Manip qw(Date_Init UnixDate);
use Date::Parse;
use Readonly;

use base qw(Exporter);
our @EXPORT = qw(getISODate getFileDate getUniqueFileDate getDateAndTime fixDateField parseNaturalDate getShortFiledate getCurrentHour getCurrentDay getISODate_nDaysOffset offsetISODate setmylocaltime); ## no critic (Modules::ProhibitAutomaticExporta...

our $VERSION = 0.995;

Readonly my $YEARBASEOFFSET => 1900;
my $lastUniqueDate = "";
my $UniqueDateCounter = 0;

my %timemap = (
    morning         => "06:00:00",
    premorning      => "05:45:00",
    afternoon       => "14:00:00",
    preafternoon    => "13:45:00",
    evening         => "22:00:00",
    preevening      => "21:45:00",
    night           => "22:00:00",
    prenight        => "21:45:00",
    noon            => "12:00:00",
    midnight        => "23:59:59",
    christmas       => "THISYEAR-12-24",
    "new year"      => "NEXTYEAR-01-01",
    "new years eve" => "THISYEAR-12-31",
);
my $timemap_updated = "";
my $timezoneoffset = 0;

sub setmylocaltime {
    my ($lt) = @_;
    
    $timezoneoffset = $lt;
    return 1;
}

sub getmylocaltime {
    return localtime ($timezoneoffset + time);
}

sub updateTimeMap {
    # calculate some variable date and time strings
    
    # atm, we need to run only once a day, so return quickly
    # it is the same date as last run
    my ($currentDate, undef) = getDateAndTime();
    if($timemap_updated eq $currentDate) {
        return;
    }
    $timemap_updated = $currentDate;
    
    Date_Init("TZ=CET");
    my ($sec,$min, $hour, $mday,$mon, $year, $wday,$ yday, $isdst) = getmylocaltime();
    $year += $YEARBASEOFFSET;
    $mon += 1;
    
    my $nextyear = $year+1;
    my $lastyear = $year-1;
    
    # a number of variable dates
    my %vardates = (
                    "sysadmin day"          => "last friday in june",
                    "towel day"             => "25th may",
                    "new years eve"         => "31st december",
                    "new year"              => "1st january",
                    "christmas eve"         => "24th december",
                    "christmas"             => "25th december",
                    "rene(s)* birthday"     => "9th november",
                    "frank(s)* birthday"    => "6th september",
                    
                    );
    
    foreach my $varkey (keys %vardates) {
        my $varval = $vardates{$varkey};
        my $lastYearDay = UnixDate($varval . " $lastyear", "%Y-%m-%d");
        my $currentYearDay = UnixDate($varval . " $year", "%Y-%m-%d");
        my $nextYearDay = UnixDate($varval . " $nextyear", "%Y-%m-%d");
    
        my ($tmpyear, $tmpmon, $tmpday) = split/\-/, $currentYearDay;
        # normal
        if($mon < $tmpmon || ($mon == $tmpmon && $mday <= $tmpday)) {
            $timemap{$varkey} = $currentYearDay;
        } else {
            $timemap{$varkey} = $nextYearDay;
        }
        
        # "last ..."
        my $lastvarkey = "last " . $varkey;
        if($mon < $tmpmon || ($mon == $tmpmon && $mday <= $tmpday)) {
            $timemap{$lastvarkey} = $lastYearDay;
        } else {
            $timemap{$lastvarkey} = $currentYearDay;
        }
    }
    return;
}

sub getISODate {
    my ($sec,$min, $hour, $mday,$mon, $year, $wday,$ yday, $isdst) = getmylocaltime();
    $year += $YEARBASEOFFSET;
    $mon += 1;
    
    $mon = doFPad($mon, 2);
    $mday = doFPad($mday, 2);
    $hour = doFPad($hour, 2);
    $min = doFPad($min, 2);
    $sec = doFPad($sec, 2);
    return "$year-$mon-$mday $hour:$min:$sec";
}

sub getISODate_nDaysOffset {
    my ($nDays) = @_;



( run in 2.499 seconds using v1.01-cache-2.11-cpan-99c4e6809bf )