@@ -, +, @@ far future done in the floating timezone. date with the expiry date. The comparison is now done in the floating timezone. If the expiry date is before the due date, it is returned in the user context's timezone. to loan period of 21 hours. Test checking out with a manual due date /time just before today 23:59 and after that. In the second case the due date/time should become today 23:59 (note that 23:59 is not shown on the checkout form). --- C4/Circulation.pm | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) --- a/C4/Circulation.pm +++ a/C4/Circulation.pm @@ -768,20 +768,21 @@ sub CanBookBeIssued { $issuingimpossible{EXPIRED} = 1; } else { my ($y, $m, $d) = split /-/,$borrower->{'dateexpiry'}; - if ($y && $m && $d) { # are we really writing oinvalid dates to borrs + if ($y && $m && $d) { # are we really writing invalid dates to borrs my $expiry_dt = DateTime->new( year => $y, month => $m, day => $d, - time_zone => C4::Context->tz, + time_zone => 'floating', #prevent trouble with future dates in named timezones (see bug 13242, 14494) ); $expiry_dt->truncate( to => 'day'); my $today = $now->clone()->truncate(to => 'day'); + $today->set_time_zone( 'floating' ); if (DateTime->compare($today, $expiry_dt) == 1) { $issuingimpossible{EXPIRED} = 1; } } else { - carp("Invalid expity date in borr"); + carp("Invalid expiry date in borr"); $issuingimpossible{EXPIRED} = 1; } } @@ -3457,10 +3458,11 @@ sub CalcDateDue { # if ReturnBeforeExpiry ON the datedue can't be after borrower expirydate if ( C4::Context->preference('ReturnBeforeExpiry') ) { - my $expiry_dt = dt_from_string( $borrower->{dateexpiry}, 'iso' ); + my $expiry_dt = dt_from_string( $borrower->{dateexpiry}, 'iso', 'floating'); $expiry_dt->set( hour => 23, minute => 59); - if ( DateTime->compare( $datedue, $expiry_dt ) == 1 ) { - $datedue = $expiry_dt->clone; + my $d1= $datedue->clone->set_time_zone('floating'); + if ( DateTime->compare( $d1, $expiry_dt ) == 1 ) { + $datedue = $expiry_dt->clone->set_time_zone( C4::Context->tz ); } } --