diff --git a/core/lib/Drupal/Component/Datetime/DateTimePlus.php b/core/lib/Drupal/Component/Datetime/DateTimePlus.php
index 3495314..ee9a26e 100644
--- a/core/lib/Drupal/Component/Datetime/DateTimePlus.php
+++ b/core/lib/Drupal/Component/Datetime/DateTimePlus.php
@@ -314,7 +314,16 @@ public function __call($method, $args) {
     if (!method_exists($this->dateTimeObject, $method)) {
       throw new \BadMethodCallException(sprintf('Call to undefined method %s::%s()', get_class($this), $method));
     }
-    return call_user_func_array([$this->dateTimeObject, $method], $args);
+
+    $val = call_user_func_array([$this->dateTimeObject, $method], $args);
+
+    if (is_object($val) && get_class($val) === 'DateTime') {
+      $this->dateTimeObject = $val;
+      return $this;
+    }
+    else {
+      return $val;
+    }
   }
 
   /**
diff --git a/core/tests/Drupal/Tests/Component/Datetime/DateTimePlusTest.php b/core/tests/Drupal/Tests/Component/Datetime/DateTimePlusTest.php
index 2becc97..1699573 100644
--- a/core/tests/Drupal/Tests/Component/Datetime/DateTimePlusTest.php
+++ b/core/tests/Drupal/Tests/Component/Datetime/DateTimePlusTest.php
@@ -804,4 +804,19 @@ public function testValidateFormat() {
     $date = DateTimePlus::createFromFormat('Y-m-d H:i:s', '11-03-31 17:44:00', 'UTC', ['validate_format' => TRUE]);
   }
 
+  /**
+   * Tests that object methods are chainable.
+   */
+  public function testChainable() {
+    $date = new DateTimePlus();
+
+    $date->setTimestamp(12345678);
+    $rendered = $date->render();
+    $this->assertEquals('1970-05-24 07:21:18 Australia/Sydney', $rendered);
+
+    $date->setTimestamp(23456789);
+    $rendered = $date->setTimezone(new \DateTimeZone('America/New_York'))->render();
+    $this->assertEquals('1970-09-29 07:46:29 America/New_York', $rendered);
+  }
+
 }
diff --git a/core/tests/Drupal/Tests/Core/Datetime/DrupalDateTimeTest.php b/core/tests/Drupal/Tests/Core/Datetime/DrupalDateTimeTest.php
index eff9f77..666512d 100644
--- a/core/tests/Drupal/Tests/Core/Datetime/DrupalDateTimeTest.php
+++ b/core/tests/Drupal/Tests/Core/Datetime/DrupalDateTimeTest.php
@@ -156,4 +156,30 @@ public function providerTestInvalidDateDiff() {
     ];
   }
 
+  /**
+   * Tests that object methods are chainable.
+   */
+  public function testChainable() {
+    $date = new DrupalDateTime('now', NULL, ['langcode' => 'en']);
+
+    $date->setTimestamp(12345678);
+    $rendered = $date->render();
+    $this->assertEquals('1970-05-24 07:21:18 Australia/Sydney', $rendered);
+
+    $date->setTimestamp(23456789);
+    $rendered = $date->setTimezone(new \DateTimeZone('America/New_York'))->render();
+    $this->assertEquals('1970-09-29 07:46:29 America/New_York', $rendered);
+  }
+
+}
+
+namespace Drupal\Core\Datetime;
+
+/**
+ * Shadow drupal_get_user_timezone().
+ *
+ * @returns string
+ */
+function drupal_get_user_timezone() {
+  return date_default_timezone_get();
 }
