diff --git a/includes/bootstrap.inc b/includes/bootstrap.inc
index dc569b1..b9e2ce2 100644
--- a/includes/bootstrap.inc
+++ b/includes/bootstrap.inc
@@ -2552,11 +2552,34 @@ 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());
-  }
-}
+    return variable_get('date_default_timezone', ini_get('date.timezone') ? ini_get('date.timezone') : 'UTC');
+  }
+}
+
+/**
++ * Initialize the timezone for a request.
++ *
++ * 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_init_timezone() {
+  $configured_timezone = drupal_get_user_timezone();
+  $system_timezone = ini_get('date.timezone');
+  // If there is no timezone set in php.ini at all, PHP will throw an
+  // E_STRICT or E_WARNING if a date function is called.
+  // Ensure a timezone is set from configuration, falling back to UTC.
+  if (!$system_timezone) {
+    $timezone = $configured_timezone ? $configured_timezone : 'UTC';
+    date_default_timezone_set($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
+  // from the operating sytem.
+  elseif ($configured_timezone && $configured_timezone != $system_timezone) {
+    date_default_timezone_set($configured_timezone);
+   }
+ }
 
 /**
  * Gets a salt useful for hardening against SQL injection.
@@ -2669,7 +2692,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_init_timezone();
       // If the skipping of the bootstrap hooks is not enforced, call
       // hook_boot.
       if (variable_get('page_cache_invoke_hooks', TRUE)) {
diff --git a/includes/session.inc b/includes/session.inc
index 25aa347..219bdae 100644
--- a/includes/session.inc
+++ b/includes/session.inc
@@ -270,7 +270,7 @@ function drupal_session_initialize() {
       $_COOKIE[$insecure_session_name] = $session_id;
     }
   }
-  date_default_timezone_set(drupal_get_user_timezone());
+  drupal_init_timezone();
 }
 
 /**
@@ -409,7 +409,7 @@ function drupal_session_regenerate() {
     drupal_session_start();
     $user = $account;
   }
-  date_default_timezone_set(drupal_get_user_timezone());
+  drupal_init_timezone();
 }
 
 /**
