--- loncom/interface/lonclonecourse.pm 2015/06/23 17:49:06 1.11 +++ loncom/interface/lonclonecourse.pm 2016/01/21 00:12:38 1.12 @@ -1,7 +1,7 @@ # The LearningOnline Network # routines for clone a course # -# $Id: lonclonecourse.pm,v 1.11 2015/06/23 17:49:06 musolffc Exp $ +# $Id: lonclonecourse.pm,v 1.12 2016/01/21 00:12:38 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -30,6 +30,8 @@ package Apache::lonclonecourse; use LONCAPA; use Apache::lonnet; +use DateTime(); +use DateTime::TimeZone; # ================================================ Get course directory listing @@ -148,6 +150,22 @@ sub copyresourcedb { my $delta=$date_shift*60*60*24; my %origcrsdata=&Apache::lonnet::coursedescription($origcrsid); my %newcrsdata= &Apache::lonnet::coursedescription($newcrsid); + my $origtz; + if (($date_mode) && ($date_mode ne 'preserve') && ($date_shift) && + (int($date_shift) == $date_shift)) { + $origtz = $origcrsdata{'timezone'}; + if ($origtz eq '') { + my %domdefaults = &Apache::lonnet::get_domain_defaults($origcrsdata{'domain'}); + if ($domdefaults{'timezone_def'} ne '') { + $origtz = $domdefaults{'timezone_def'}; + } + } + if ($origtz eq '') { + $origtz = 'local'; + } elsif (!DateTime::TimeZone->is_valid_name($origtz)) { + $origtz = 'local'; + } + } my %data=&Apache::lonnet::dump ('resourcedata',$origcrsdata{'domain'},$origcrsdata{'num'}); $origcrsid=~s/^\///; @@ -195,14 +213,24 @@ sub copyresourcedb { # date_mode other: do not transfer dates if (($date_mode) && ($date_mode ne 'preserve')) { if ($data{$key.'.type'}=~/^date_(start|end)$/) { - if ($date_mode eq 'shift') { - $newdata{$thiskey}=$newdata{$thiskey}+$delta; - } else { - delete($newdata{$thiskey}); - delete($newdata{$thiskey.'.type'}); - } + if ($date_mode eq 'shift') { + if (($date_shift) && ($date_shift == int($date_shift))) { + my $dt = DateTime->from_epoch(epoch => $newdata{$thiskey}) + ->set_time_zone($origtz); + if (($origtz eq 'local') && (!$ENV{TZ})) { + $ENV{TZ} = $dt->time_zone()->name(); + } + $dt->add(days => int($date_shift)); + $newdata{$thiskey} = $dt->epoch(); + } else { + $newdata{$thiskey} = $newdata{$thiskey}+$delta; + } + } else { + delete($newdata{$thiskey}); + delete($newdata{$thiskey.'.type'}); + } } - } + } } return &Apache::lonnet::put ('resourcedata',\%newdata,$newcrsdata{'domain'},$newcrsdata{'num'});