From 17fd3edb94a581fc571f5775ee8240a8b3518b93 Mon Sep 17 00:00:00 2001 From: bernhard Date: Wed, 19 Aug 2020 16:40:41 +0200 Subject: [PATCH] Issue #238: implement the UTC-workaround for PreviousEventGet() Just like in NextEventGet() --- Kernel/System/CronEvent.pm | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/Kernel/System/CronEvent.pm b/Kernel/System/CronEvent.pm index b28e2ae70c..fa356e220f 100644 --- a/Kernel/System/CronEvent.pm +++ b/Kernel/System/CronEvent.pm @@ -84,6 +84,7 @@ sub NextEventGet { } my $StartDateTime = $Param{StartDateTime} || $Kernel::OM->Create('Kernel::System::DateTime'); + return if !$StartDateTime; # Calculations are only made in UTC time zone to prevent errors with times that @@ -106,6 +107,7 @@ sub NextEventGet { ); return if !$CronObject; + my ( $Sec, $Min, $Hour, $Day, $Month, $Year ) = $CronObject->nextEvent(); my $EventDateTime = $Kernel::OM->Create( @@ -162,6 +164,7 @@ sub NextEventList { } my $StartDateTime = $Param{StartDateTime} || $Kernel::OM->Create('Kernel::System::DateTime'); + return if !$StartDateTime; if ( $StartDateTime > $Param{StopDateTime} ) { @@ -239,8 +242,22 @@ sub PreviousEventGet { } my $StartDateTime = $Param{StartDateTime} || $Kernel::OM->Create('Kernel::System::DateTime'); + return if !$StartDateTime; + # Calculations are only made in UTC time zone to prevent errors with times that + # would not exist in the given time zone (e. g. on/around daylight saving time switch). + # CPAN DateTime fails if trying to create a object of a non-existing + # time in the given time zone. Converting it to UTC and back has the desired effect. + my $OTOBOTimeZone = $StartDateTime->OTOBOTimeZoneGet(); + my $TimeZoneChanged; + if ( $OTOBOTimeZone ne 'UTC' ) { + $StartDateTime->ToTimeZone( + TimeZone => 'UTC' + ); + $TimeZoneChanged = 1; + } + # init cron object my $CronObject = $Self->_Init( Schedule => $Param{Schedule}, @@ -254,15 +271,22 @@ sub PreviousEventGet { my $EventDateTime = $Kernel::OM->Create( 'Kernel::System::DateTime', ObjectParams => { - Year => $Year + 1900, - Month => $Month + 1, - Day => $Day, - Hour => $Hour, - Minute => $Min, - Second => $Sec, + Year => $Year + 1900, + Month => $Month + 1, + Day => $Day, + Hour => $Hour, + Minute => $Min, + Second => $Sec, + TimeZone => 'UTC' }, ); + if ($TimeZoneChanged) { + $EventDateTime->ToTimeZone( + TimeZone => $OTOBOTimeZone + ); + } + return $EventDateTime->ToString(); }