diff --git a/Kernel/System/Calendar/Appointment.pm b/Kernel/System/Calendar/Appointment.pm index e5225cb295a..cc3789d18b0 100644 --- a/Kernel/System/Calendar/Appointment.pm +++ b/Kernel/System/Calendar/Appointment.pm @@ -2286,6 +2286,9 @@ sub AppointmentNotification { sub _AppointmentRecurringCreate { my ( $Self, %Param ) = @_; + my %User = $Kernel::OM->Get('Kernel::System::User')->GetUserData( + UserID => $Param{Appointment}->{UserID} + ); # check needed stuff for my $Needed (qw(ParentID Appointment)) { @@ -2302,12 +2305,14 @@ sub _AppointmentRecurringCreate { 'Kernel::System::DateTime', ObjectParams => { String => $Param{Appointment}->{StartTime}, + TimeZone => $User{UserTimeZone} || '', }, ); my $EndTimeObject = $Kernel::OM->Create( 'Kernel::System::DateTime', ObjectParams => { String => $Param{Appointment}->{EndTime}, + TimeZone => $User{UserTimeZone} || '', }, ); @@ -2366,6 +2371,30 @@ sub _AppointmentRecurringCreate { Time => $EndTime, ); + # Account for Dates in different timezones + my $StartDSTDiff = $StartTimeObject->CompareDST($OriginalStartTimeObject); + my $EndDSTDiff = $EndTimeObject->CompareDST($OriginalEndTimeObject); + my $CurrentStartTimeObject = $StartTimeObject->Clone(); + my $CurrentEndTimeObject = $EndTimeObject->Clone(); + if ( IsInteger( $StartDSTDiff ) ) { + if ( $StartDSTDiff > 0 ) { + $CurrentStartTimeObject->Subtract( Seconds => $StartDSTDiff ); + } + elsif ( $StartDSTDiff < 0 ) { + $CurrentStartTimeObject->Add( Seconds => ($StartDSTDiff * -1)); + } + $StartTime = $CurrentStartTimeObject->ToString(); + } + if ( IsInteger( $EndDSTDiff ) ) { + if ( $EndDSTDiff > 0 ) { + $CurrentEndTimeObject->Subtract( Seconds => $EndDSTDiff ); + } + elsif ( $EndDSTDiff < 0 ) { + $CurrentEndTimeObject->Add( Seconds => ($EndDSTDiff * -1)); + } + $EndTime = $CurrentEndTimeObject->ToString(); + } + # skip excluded appointments next UNTIL_TIME if grep { $StartTime eq $_ } @RecurrenceExclude; diff --git a/Kernel/System/DateTime.pm b/Kernel/System/DateTime.pm index 2b0f7375ff3..5e627a969b1 100644 --- a/Kernel/System/DateTime.pm +++ b/Kernel/System/DateTime.pm @@ -2232,6 +2232,20 @@ sub _OpNotEquals { return $Result; } +=head2 CompareDST() + + this function checks compares two DateTime objects and returns the TimeDifference in seconds + my $DSTDiff = $DateTimeObject->CompareDST( $OtherDateTimeObject ); + return: '3600' + +=cut + +sub CompareDST { + my ($Self, $OtherDateTimeObject) = @_; + + return $Self->{CPANDateTimeObject}->offset - $OtherDateTimeObject->{CPANDateTimeObject}->offset; +} + 1; =end Internal: