diff --git a/core/lib/Drupal/Core/Cache/CacheBackendInterface.php b/core/lib/Drupal/Core/Cache/CacheBackendInterface.php
index 021e2f7..88e3b23 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).
    * @param array $tags
    *   An array of tags to be stored with the cache item. These should normally
    *   identify objects used to build the cache item, which should trigger
diff --git a/core/lib/Drupal/Core/Cache/DatabaseBackend.php b/core/lib/Drupal/Core/Cache/DatabaseBackend.php
index 9416548..629e029 100644
--- a/core/lib/Drupal/Core/Cache/DatabaseBackend.php
+++ b/core/lib/Drupal/Core/Cache/DatabaseBackend.php
@@ -100,6 +100,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/system/tests/cache.test b/core/modules/system/tests/cache.test
index 8a5d9ff..a5b750b 100644
--- a/core/modules/system/tests/cache.test
+++ b/core/modules/system/tests/cache.test
@@ -377,6 +377,25 @@ class CacheClearCase extends CacheTestCase {
   }
 
   /**
+   * Test that items set to expire at a certain time are handled properly.
+   */
+  function testExpired() {
+    $cache = cache($this->default_bin);
+
+    // Set a cache item that should expire in the far future.
+    $data = $this->randomName(20);
+    $cache->set($data, $data, REQUEST_TIME + 3600);
+    // Item should be found in cache.
+    $this->assertCacheExists(t('Cached item with future expiry date returned by cache'), $data, $data);
+
+    //  Set a cache item that should have already expired.
+    $data = $this->randomName(20);
+    $cache->set($data, $data, REQUEST_TIME - 3600);
+    // Item should not be found in cache, since it has expired.
+    $this->assertCacheRemoved(t('Expired cache item not returned by cache'), $data, $data);
+  }
+
+  /**
    * Test clearing using cache tags.
    */
   function testClearTags() {
