diff --git a/core/lib/Drupal/Core/Cache/CacheBackendInterface.php b/core/lib/Drupal/Core/Cache/CacheBackendInterface.php
index b4c21ce..694cddf 100644
--- a/core/lib/Drupal/Core/Cache/CacheBackendInterface.php
+++ b/core/lib/Drupal/Core/Cache/CacheBackendInterface.php
@@ -98,7 +98,9 @@ interface CacheBackendInterface {
    *   - CACHE_TEMPORARY: Indicates that the item should be removed at the next
    *     general cache wipe.
    *   - A Unix timestamp: Indicates that the item should be kept at least until
-   *     the given time, after which it behaves like CACHE_TEMPORARY.
+   *     the given time, after which it will behave as if it did not exist in
+   *     the cache (and will be completely removed at the next general cache
+   *     wipe).
    */
   function set($cid, $data, $expire = CACHE_PERMANENT);
 
diff --git a/core/lib/Drupal/Core/Cache/DatabaseBackend.php b/core/lib/Drupal/Core/Cache/DatabaseBackend.php
index 44a4111..bf34284 100644
--- a/core/lib/Drupal/Core/Cache/DatabaseBackend.php
+++ b/core/lib/Drupal/Core/Cache/DatabaseBackend.php
@@ -95,6 +95,11 @@ class DatabaseBackend implements CacheBackendInterface {
     if (!isset($cache->data)) {
       return FALSE;
     }
+    // If the cached data was set to expire at a certain time and that time has
+    // passed, ignore the cache entry.
+    if ($cache->expire > 0 && $cache->expire < REQUEST_TIME) {
+      return FALSE;
+    }
     // If the cached data is temporary and subject to a per-user minimum
     // lifetime, compare the cache entry timestamp with the user session
     // cache_expiration timestamp. If the cache entry is too old, ignore it.
diff --git a/core/modules/simpletest/tests/cache.test b/core/modules/simpletest/tests/cache.test
index 7040aef..b0f7f8a 100644
--- a/core/modules/simpletest/tests/cache.test
+++ b/core/modules/simpletest/tests/cache.test
@@ -370,6 +370,25 @@ class CacheClearCase extends CacheTestCase {
     $cached = cache('page')->get($data);
     $this->assertFalse($cached, 'Cached item was invalidated');
   }
+
+  /**
+   * Test that items set to expire at a certain time are handled properly.
+   */
+  function testExpired() {
+    $data = $this->randomName(100);
+
+    // Set a cache item that should expire in the far future.
+    cache()->set($data, $data, REQUEST_TIME + 3600);
+    // Item should be found in cache.
+    $this->assertCacheExists('Cached item with future expiry date returned by cache', $data, $data);
+
+    //  Set a cache item that should have already expired.
+    $data = $this->randomName(100);
+    cache()->set($data, $data, REQUEST_TIME - 3600);
+    // Item should not be found in cache, since it has expired.
+    $cached = cache('page')->get($data);
+    $this->assertFalse($cached, t('Expired cache item not returned by cache'));
+  }
 }
 
 /**
