[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 ((&current_language=~/^en/) || (!$lh)) {
 
 	return $dt->strftime("%a %b %e %I:%M:%S %P %Y (%Z)");