use strict; use warnings; #use diagnostics; use DateTime; use DateTime::Format::Strptime; use DateTime::Event::Recurrence; # PART 2 our $LocalTZ = DateTime::TimeZone->new( name => 'local' ); my $dtnow = DateTime->now(time_zone => $LocalTZ); # Current *local* time printf("\$dtnow: !%s!\n\n", $dtnow); my $lo = "18/03/2019 10:12:53 am"; # Always works my $hi = "24/03/2019 3:15:00 pm"; # Does not work... the format I need to use # my $hi = "24/03/2019 03:15:00 pm"; # Does not work # my $hi = "24/03/2019 3:15:00 pm"; # Does not work # my $hi = "24/03/2019 15:15:00 pm"; # Works but 15hrs with 'pm' is silly # my $hi = "24/03/2019 15:15:00"; # Works my $dmy_fmt = DateTime::Format::Strptime->new( # Let DateTime use 'dd/mm/yyyy' pattern => '%d/%m/%Y %I:%M:%S %p', # pattern => '%d/%m/%Y %I:%M:%S', # Use this when no 'am/pm' in the date string # time_zone => 'Australia/Victoria', time_zone => 'local', on_error => 'croak' ); my $lodt = $dmy_fmt->parse_datetime($lo); printf(" \$lodt: !%s!\n", $lodt); my $hidt = $dmy_fmt->parse_datetime($hi); printf(" \$hidt: !%s!\n", $hidt); # ========== PART 2 ========== my $rec1 = DateTime::Event::Recurrence->daily(start => $lodt); # $rec1->set_time_zone('local'); # Doesn't change the 'mis-conversion' my @days = $rec1->as_list( start => $lodt, end => $hidt ); printf("1st Format DAYS:\n"); foreach my $day (@days) { printf(" %s\n", $day->dmy("-")); } printf("\n"); # ---- A different (truncated) format my $strp = DateTime::Format::Strptime->new( pattern => '%d/%m/%Y', time_zone => 'local', on_error => 'croak' ); my $dt1 = $strp->parse_datetime("18/03/2019"); #my $dt1 = $strp->parse_datetime($lo); printf(" \$dt1: !%s!\n", $dt1); my $dt2 = $strp->parse_datetime("24/03/2019"); #my $dt2 = $strp->parse_datetime($hi); printf(" \$dt2: !%s!\n", $dt2); my $rec2 = DateTime::Event::Recurrence->daily(start => $dt1); @days = $rec2->as_list( start => $dt1, end => $dt2 ); printf("2nd Format DAYS:\n"); foreach my $day (@days) { printf(" %s\n", $day->dmy("-")); } printf("\n");