[LON-CAPA-cvs] cvs: loncom /localize lonlocal.pm
lueken
lueken@source.lon-capa.org
Mon, 04 May 2009 21:44:01 -0000
lueken Mon May 4 21:44:01 2009 EDT
Modified files:
/loncom/localize lonlocal.pm
Log:
Locallocaltime-Function SpeedUp Hack
Index: loncom/localize/lonlocal.pm
diff -u loncom/localize/lonlocal.pm:1.57 loncom/localize/lonlocal.pm:1.58
--- loncom/localize/lonlocal.pm:1.57 Thu Apr 16 15:51:42 2009
+++ loncom/localize/lonlocal.pm Mon May 4 21:44:00 2009
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Localization routines
#
-# $Id: lonlocal.pm,v 1.57 2009/04/16 15:51:42 www Exp $
+# $Id: lonlocal.pm,v 1.58 2009/05/04 21:44:00 lueken Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -393,8 +393,11 @@
return 'local';
}
+our $timezone_local;
+
sub locallocaltime {
- my ($thistime,$timezone) = @_;
+ my ($thistime,$timezone,$datetime) = @_;
+
if (!defined($thistime) || $thistime eq '') {
return &mt('Never');
}
@@ -407,8 +410,70 @@
return &mt('Never');
}
- my $dt = DateTime->from_epoch(epoch => $thistime)
- ->set_time_zone(&gettimezone($timezone));
+ my $dt;
+ my $convert_time;
+
+ #### START # Speed up if this function is called often ####
+
+ # Is a $datetime parameter set?
+ if(defined($datetime)) {
+ # Check for an instance of a DateTime object
+ if(!(defined $$datetime)) {
+ # No object, create one
+ $$datetime = DateTime->from_epoch(epoch => $thistime)
+ ->set_time_zone(&gettimezone($timezone));
+ $dt = $$datetime;
+ } else {
+ # If the return-value is "local", we have to convert it for DateTime
+
+ # Converts the "local"-String only once
+ if(!defined($timezone_local))
+ {
+ $timezone_local = DateTime::TimeZone->new( name => gettimezone('local'))->name();
+ }
+
+ my $timezone_now;
+
+ if(gettimezone($timezone) == 'local')
+ {
+ $timezone_now = $timezone_local;
+ } else {
+ $timezone_now = gettimezone($timezone);
+ }
+
+ # Has the timezone changed?
+ if($timezone_now eq $$datetime->time_zone_short_name() ||
+ $timezone_now eq $$datetime->time_zone_long_name())
+ {
+ # There is already an object (dereference)
+ $dt = $$datetime;
+
+ # We need this as temporary value
+ $convert_time = DateTime->from_epoch( epoch => $thistime );
+ #->set_time_zone('floating');
+
+ # Preventing a set_time_zone call (time consuming)
+ # Using old instance of DateTime with timezone
+ $dt->set( year => $convert_time->year(),
+ month => $convert_time->month(),
+ day => $convert_time->day(),
+ hour => $convert_time->hour(),
+ minute => $convert_time->minute(),
+ second => $convert_time->second() );
+ } else {
+ # The timezone has changed since last time
+ $$datetime = DateTime->from_epoch(epoch => $thistime)
+ ->set_time_zone(&gettimezone($timezone));
+ $dt = $$datetime;
+ }
+ }
+ } else {
+ # There is no $datetime parameter
+ $dt = DateTime->from_epoch(epoch => $thistime)
+ ->set_time_zone(&gettimezone($timezone));
+ }
+ #### END # Speed up if this function is called often ####
+
if ((¤t_language=~/^en/) || (!$lh)) {
return $dt->strftime("%a %b %e %I:%M:%S %P %Y (%Z)");