diff --git includes/bootstrap.inc includes/bootstrap.inc
index 0739332..9cc6c50 100644
--- includes/bootstrap.inc
+++ includes/bootstrap.inc
@@ -1943,9 +1944,29 @@ function drupal_get_user_timezone() {
     return $user->timezone;
   }
   else {
-    // Ignore PHP strict notice if time zone has not yet been set in the php.ini
-    // configuration.
-    return variable_get('date_default_timezone', @date_default_timezone_get());
+    // Note that is no site-wide timezone is set, and date.timezone is not set
+    // in php.ini, then calling date functions will cause a system call and
+    // PHP will issue an E_STRICT or E_WARNING error depending on PHP version.
+    // @todo: consider always setting the date_default_timezone variable from 
+    // the installer.
+    return variable_get('date_default_timezone');
+  }
+}
+
+/**
+ * Set the timezone for a request when configured.
+ *
+ * This function ensures a timezone is set if it is available in either php.ini,
+ * the default timezone for the site, or user settings.
+ */
+function drupal_set_timezone() {
+  $configured_timezone = drupal_get_user_timezone();
+  $system_timezone = ini_get('date.timezone');
+  // There is no point setting the timezone if it is configured the same
+  // as date.timezone in php.ini. Also date_default_timezone_set() validates 
+  // the timezone, which relies on a system call to get the timezone database.
+  if ($configured_timezone != $system_timezone) {
+    date_default_timezone_set($configured_timezone);
   }
 }
 
@@ -2046,7 +2067,7 @@ function _drupal_bootstrap_page_cache() {
       // Restore the metadata cached with the page.
       $_GET['q'] = $cache->data['path'];
       drupal_set_title($cache->data['title'], PASS_THROUGH);
-      date_default_timezone_set(drupal_get_user_timezone());
+      drupal_set_timezone();
       // If the skipping of the bootstrap hooks is not enforced, call
       // hook_boot.
       if (variable_get('page_cache_invoke_hooks', TRUE)) {
diff --git includes/session.inc includes/session.inc
index 23af6bd..5014edc 100644
--- includes/session.inc
+++ includes/session.inc
@@ -259,7 +259,7 @@ function drupal_session_initialize() {
     // a user becomes authenticated.
     session_id(drupal_hash_base64(uniqid(mt_rand(), TRUE)));
   }
-  date_default_timezone_set(drupal_get_user_timezone());
+  drupal_set_timezone();
 }
 
 /**
@@ -387,7 +387,7 @@ function drupal_session_regenerate() {
     drupal_session_start();
     $user = $account;
   }
-  date_default_timezone_set(drupal_get_user_timezone());
+  drupal_set_timezone();
 }
 
 /**
diff --git modules/simpletest/tests/common.test modules/simpletest/tests/common.test
index f484975..aece263 100644
--- modules/simpletest/tests/common.test
+++ modules/simpletest/tests/common.test
@@ -2226,7 +2226,7 @@ class FormatDateUnitTest extends DrupalWebTestCase {
     $real_language = $language->language;
     $language->language = $user->language;
     // Simulate a Drupal bootstrap with the logged-in user.
-    date_default_timezone_set(drupal_get_user_timezone());
+    drupal_set_timezone();
 
     $this->assertIdentical(format_date($timestamp, 'custom', 'l, d-M-y H:i:s T', 'America/Los_Angeles', 'en'), 'Sunday, 25-Mar-07 17:00:00 PDT', t('Test a different language.'));
     $this->assertIdentical(format_date($timestamp, 'custom', 'l, d-M-y H:i:s T', 'Europe/London'), 'Monday, 26-Mar-07 01:00:00 BST', t('Test a different time zone.'));
@@ -2240,7 +2240,7 @@ class FormatDateUnitTest extends DrupalWebTestCase {
     $user = $real_user;
     $language->language = $real_language;
     // Restore default time zone.
-    date_default_timezone_set(drupal_get_user_timezone());
+    drupal_set_timezone();
     drupal_save_session(TRUE);
   }
 }
