diff --git a/core/lib/Drupal/Core/Entity/ContentEntityType.php b/core/lib/Drupal/Core/Entity/ContentEntityType.php
index 0e26c3bb51..6fdfb36890 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityType.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityType.php
@@ -23,6 +23,13 @@ public function __construct($definition) {
       'storage' => 'Drupal\Core\Entity\Sql\SqlContentEntityStorage',
       'view_builder' => 'Drupal\Core\Entity\EntityViewBuilder',
     ];
+
+    // Provide a default key for the 'created' date if the entity implements
+    // the relevant interface.
+    // @see \Drupal\Core\Entity\EntityCreatedInterface
+    if (is_subclass_of($this->class, EntityCreatedInterface::class)) {
+      $this->entity_keys += ['created' => 'created'];
+    }
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Entity/EntityCreatedInterface.php b/core/lib/Drupal/Core/Entity/EntityCreatedInterface.php
new file mode 100644
index 0000000000..c01d0c47a2
--- /dev/null
+++ b/core/lib/Drupal/Core/Entity/EntityCreatedInterface.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace Drupal\Core\Entity;
+
+/**
+ * Defines an interface for entity creation timestamp tracking.
+ */
+interface EntityCreatedInterface {
+
+  /**
+   * Returns the time that the entity was created.
+   *
+   * @return int
+   *   The UNIX timestamp of when the entity was created.
+   */
+  public function getCreatedTime();
+
+  /**
+   * Sets the creation time of the entity.
+   *
+   * @param int $timestamp
+   *   The UNIX timestamp of when the entity was created.
+   *
+   * @return $this
+   *   The class instance that this method is called on.
+   */
+  public function setCreatedTime($timestamp);
+
+}
diff --git a/core/lib/Drupal/Core/Entity/EntityCreatedTrait.php b/core/lib/Drupal/Core/Entity/EntityCreatedTrait.php
new file mode 100644
index 0000000000..d53a339e2e
--- /dev/null
+++ b/core/lib/Drupal/Core/Entity/EntityCreatedTrait.php
@@ -0,0 +1,72 @@
+<?php
+
+namespace Drupal\Core\Entity;
+
+use Drupal\Core\Entity\Exception\UnsupportedEntityTypeDefinitionException;
+use Drupal\Core\Field\BaseFieldDefinition;
+
+/**
+ * Provides a trait for getting and setting the created time of an entity.
+ */
+trait EntityCreatedTrait {
+
+  /**
+   * Returns an array of base field definitions for the creation date.
+   *
+   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
+   *   The entity type to add the created time field to.
+   *
+   * @return \Drupal\Core\Field\BaseFieldDefinition[]
+   *   An array of base field definitions.
+   *
+   * @throws \Drupal\Core\Entity\Exception\UnsupportedEntityTypeDefinitionException
+   *   Thrown when the entity type does not implement EntityCreatedInterface
+   *   or if it does not have a "created" entity key.
+   */
+  public static function createdBaseFieldDefinitions(EntityTypeInterface $entity_type) {
+    if (!is_subclass_of($entity_type->getClass(), EntityCreatedInterface::class)) {
+      throw new UnsupportedEntityTypeDefinitionException('The entity type ' . $entity_type->id() . ' does not implement \Drupal\Core\Entity\EntityCreatedInterface.');
+    }
+    if (!$entity_type->hasKey('created')) {
+      throw new UnsupportedEntityTypeDefinitionException('The entity type ' . $entity_type->id() . ' does not have a "created" entity key.');
+    }
+
+    return [
+      $entity_type->getKey('created') => BaseFieldDefinition::create('created')
+        ->setLabel(t('Created'))
+        ->setDescription(t('The UNIX timestamp indicating when the entity was created.'))
+        ->setTranslatable($entity_type->isTranslatable())
+        ->setRevisionable($entity_type->isRevisionable()),
+    ];
+  }
+
+  /**
+   * Returns the time that the entity was created.
+   *
+   * @return int
+   *   The UNIX timestamp of when the entity was created.
+   */
+  public function getCreatedTime() {
+    $key = $this->getEntityType()->getKey('created');
+    if (isset($this->get($key)->value)) {
+      return $this->get($key)->value;
+    }
+    return NULL;
+  }
+
+  /**
+   * Sets the creation time of the entity.
+   *
+   * @param int $timestamp
+   *   The UNIX timestamp of when the entity was created.
+   *
+   * @return $this
+   *   The class instance that this method is called on.
+   */
+  public function setCreatedTime($timestamp) {
+    $key = $this->getEntityType()->getKey('created');
+    $this->set($key, $timestamp);
+    return $this;
+  }
+
+}
diff --git a/core/modules/comment/src/CommentInterface.php b/core/modules/comment/src/CommentInterface.php
index e80e5edfdc..3d79539235 100644
--- a/core/modules/comment/src/CommentInterface.php
+++ b/core/modules/comment/src/CommentInterface.php
@@ -3,6 +3,7 @@
 namespace Drupal\comment;
 
 use Drupal\Core\Entity\ContentEntityInterface;
+use Drupal\Core\Entity\EntityCreatedInterface;
 use Drupal\Core\Entity\EntityPublishedInterface;
 use Drupal\user\EntityOwnerInterface;
 use Drupal\Core\Entity\EntityChangedInterface;
@@ -10,7 +11,7 @@
 /**
  * Provides an interface defining a comment entity.
  */
-interface CommentInterface extends ContentEntityInterface, EntityChangedInterface, EntityOwnerInterface, EntityPublishedInterface {
+interface CommentInterface extends ContentEntityInterface, EntityChangedInterface, EntityCreatedInterface, EntityOwnerInterface, EntityPublishedInterface {
 
   /**
    * Comment is awaiting approval.
@@ -189,25 +190,6 @@ public function getHostname();
   public function setHostname($hostname);
 
   /**
-   * Returns the time that the comment was created.
-   *
-   * @return int
-   *   The timestamp of when the comment was created.
-   */
-  public function getCreatedTime();
-
-  /**
-   * Sets the creation date of the comment.
-   *
-   * @param int $created
-   *   The timestamp of when the comment was created.
-   *
-   * @return $this
-   *   The class instance that this method is called on.
-   */
-  public function setCreatedTime($created);
-
-  /**
    * Returns the comment's status.
    *
    * @return int
diff --git a/core/modules/comment/src/Entity/Comment.php b/core/modules/comment/src/Entity/Comment.php
index a5f1966469..e931df8e58 100644
--- a/core/modules/comment/src/Entity/Comment.php
+++ b/core/modules/comment/src/Entity/Comment.php
@@ -7,6 +7,7 @@
 use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\comment\CommentInterface;
 use Drupal\Core\Entity\EntityChangedTrait;
+use Drupal\Core\Entity\EntityCreatedTrait;
 use Drupal\Core\Entity\EntityPublishedTrait;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
@@ -68,6 +69,7 @@
 class Comment extends ContentEntityBase implements CommentInterface {
 
   use EntityChangedTrait;
+  use EntityCreatedTrait;
   use EntityPublishedTrait;
 
   /**
@@ -224,8 +226,9 @@ public function permalink() {
    */
   public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
     /** @var \Drupal\Core\Field\BaseFieldDefinition[] $fields */
-    $fields = parent::baseFieldDefinitions($entity_type);
-    $fields += static::publishedBaseFieldDefinitions($entity_type);
+    $fields = parent::baseFieldDefinitions($entity_type)
+      + static::createdBaseFieldDefinitions($entity_type)
+      + static::publishedBaseFieldDefinitions($entity_type);
 
     $fields['cid']->setLabel(t('Comment ID'))
       ->setDescription(t('The comment ID.'));
@@ -291,10 +294,9 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ->setTranslatable(TRUE)
       ->setSetting('max_length', 128);
 
-    $fields['created'] = BaseFieldDefinition::create('created')
-      ->setLabel(t('Created'))
-      ->setDescription(t('The time that the comment was created.'))
-      ->setTranslatable(TRUE);
+    // Override the default description of 'created' base field.
+    // @see \Drupal\Core\Entity\EntityCreatedTrait::createdBaseFieldDefinitions()
+    $fields['created']->setDescription(t('The time that the comment was created.'));
 
     $fields['changed'] = BaseFieldDefinition::create('changed')
       ->setLabel(t('Changed'))
@@ -462,24 +464,6 @@ public function setHostname($hostname) {
   /**
    * {@inheritdoc}
    */
-  public function getCreatedTime() {
-    if (isset($this->get('created')->value)) {
-      return $this->get('created')->value;
-    }
-    return NULL;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setCreatedTime($created) {
-    $this->set('created', $created);
-    return $this;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function getStatus() {
     return $this->get('status')->value;
   }
diff --git a/core/modules/file/src/Entity/File.php b/core/modules/file/src/Entity/File.php
index a68b9bae9b..c57a99e776 100644
--- a/core/modules/file/src/Entity/File.php
+++ b/core/modules/file/src/Entity/File.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\EntityChangedTrait;
+use Drupal\Core\Entity\EntityCreatedTrait;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Field\BaseFieldDefinition;
@@ -36,6 +37,7 @@
 class File extends ContentEntityBase implements FileInterface {
 
   use EntityChangedTrait;
+  use EntityCreatedTrait;
 
   /**
    * {@inheritdoc}
@@ -105,13 +107,6 @@ public function setSize($size) {
   /**
    * {@inheritdoc}
    */
-  public function getCreatedTime() {
-    return $this->get('created')->value;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function getOwner() {
     return $this->get('uid')->entity;
   }
@@ -221,7 +216,8 @@ public static function preDelete(EntityStorageInterface $storage, array $entitie
    */
   public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
     /** @var \Drupal\Core\Field\BaseFieldDefinition[] $fields */
-    $fields = parent::baseFieldDefinitions($entity_type);
+    $fields = parent::baseFieldDefinitions($entity_type)
+      + static::createdBaseFieldDefinitions($entity_type);
 
     $fields['fid']->setLabel(t('File ID'))
       ->setDescription(t('The file ID.'));
@@ -263,9 +259,9 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ->setDescription(t('The status of the file, temporary (FALSE) and permanent (TRUE).'))
       ->setDefaultValue(FALSE);
 
-    $fields['created'] = BaseFieldDefinition::create('created')
-      ->setLabel(t('Created'))
-      ->setDescription(t('The timestamp that the file was created.'));
+    // Override the default description of 'created' base field.
+    // @see \Drupal\Core\Entity\EntityCreatedTrait::createdBaseFieldDefinitions()
+    $fields['created']->setDescription(t('The timestamp that the file was created.'));
 
     $fields['changed'] = BaseFieldDefinition::create('changed')
       ->setLabel(t('Changed'))
diff --git a/core/modules/file/src/FileInterface.php b/core/modules/file/src/FileInterface.php
index ee7120b03e..82483c6d3b 100644
--- a/core/modules/file/src/FileInterface.php
+++ b/core/modules/file/src/FileInterface.php
@@ -3,6 +3,7 @@
 namespace Drupal\file;
 
 use Drupal\Core\Entity\ContentEntityInterface;
+use Drupal\Core\Entity\EntityCreatedInterface;
 use Drupal\user\EntityOwnerInterface;
 use Drupal\Core\Entity\EntityChangedInterface;
 
@@ -11,7 +12,7 @@
  *
  * @ingroup file
  */
-interface FileInterface extends ContentEntityInterface, EntityChangedInterface, EntityOwnerInterface {
+interface FileInterface extends ContentEntityInterface, EntityChangedInterface, EntityCreatedInterface, EntityOwnerInterface {
 
   /**
    * Returns the name of the file.
@@ -108,12 +109,4 @@ public function setPermanent();
    */
   public function setTemporary();
 
-  /**
-   * Returns the file entity creation timestamp.
-   *
-   * @return int
-   *   Creation timestamp of the file entity.
-   */
-  public function getCreatedTime();
-
 }
diff --git a/core/modules/node/src/Entity/Node.php b/core/modules/node/src/Entity/Node.php
index c11a18889a..d72a95c950 100644
--- a/core/modules/node/src/Entity/Node.php
+++ b/core/modules/node/src/Entity/Node.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\EntityChangedTrait;
+use Drupal\Core\Entity\EntityCreatedTrait;
 use Drupal\Core\Entity\EntityPublishedTrait;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
@@ -82,6 +83,7 @@
 class Node extends ContentEntityBase implements NodeInterface {
 
   use EntityChangedTrait;
+  use EntityCreatedTrait;
   use EntityPublishedTrait;
 
   /**
@@ -210,22 +212,6 @@ public function setTitle($title) {
   /**
    * {@inheritdoc}
    */
-  public function getCreatedTime() {
-    return $this->get('created')->value;
-  }
-
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setCreatedTime($timestamp) {
-    $this->set('created', $timestamp);
-    return $this;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function isPromoted() {
     return (bool) $this->get('promote')->value;
   }
@@ -362,8 +348,9 @@ public function setRevisionLogMessage($revision_log_message) {
    * {@inheritdoc}
    */
   public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
-    $fields = parent::baseFieldDefinitions($entity_type);
-    $fields += static::publishedBaseFieldDefinitions($entity_type);
+    $fields = parent::baseFieldDefinitions($entity_type)
+      + static::createdBaseFieldDefinitions($entity_type)
+      + static::publishedBaseFieldDefinitions($entity_type);
 
     $fields['title'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Title'))
@@ -405,11 +392,11 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ])
       ->setDisplayConfigurable('form', TRUE);
 
-    $fields['created'] = BaseFieldDefinition::create('created')
+    // Override some of the default parameters of the 'created' base field.
+    // @see \Drupal\Core\Entity\EntityCreatedTrait::createdBaseFieldDefinitions()
+    $fields['created']
       ->setLabel(t('Authored on'))
       ->setDescription(t('The time that the node was created.'))
-      ->setRevisionable(TRUE)
-      ->setTranslatable(TRUE)
       ->setDisplayOptions('view', [
         'label' => 'hidden',
         'type' => 'timestamp',
diff --git a/core/modules/node/src/NodeInterface.php b/core/modules/node/src/NodeInterface.php
index 87b68927c0..83375b48c3 100644
--- a/core/modules/node/src/NodeInterface.php
+++ b/core/modules/node/src/NodeInterface.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\node;
 
+use Drupal\Core\Entity\EntityCreatedInterface;
 use Drupal\Core\Entity\EntityPublishedInterface;
 use Drupal\Core\Entity\RevisionLogInterface;
 use Drupal\user\EntityOwnerInterface;
@@ -11,7 +12,7 @@
 /**
  * Provides an interface defining a node entity.
  */
-interface NodeInterface extends ContentEntityInterface, EntityChangedInterface, EntityOwnerInterface, RevisionLogInterface, EntityPublishedInterface {
+interface NodeInterface extends ContentEntityInterface, EntityChangedInterface, EntityCreatedInterface, EntityOwnerInterface, RevisionLogInterface, EntityPublishedInterface {
 
   /**
    * Denotes that the node is not published.
@@ -71,25 +72,6 @@ public function getTitle();
   public function setTitle($title);
 
   /**
-   * Gets the node creation timestamp.
-   *
-   * @return int
-   *   Creation timestamp of the node.
-   */
-  public function getCreatedTime();
-
-  /**
-   * Sets the node creation timestamp.
-   *
-   * @param int $timestamp
-   *   The node creation timestamp.
-   *
-   * @return \Drupal\node\NodeInterface
-   *   The called node entity.
-   */
-  public function setCreatedTime($timestamp);
-
-  /**
    * Returns the node promotion status.
    *
    * @return bool
diff --git a/core/modules/user/src/Entity/User.php b/core/modules/user/src/Entity/User.php
index 7529532581..05e55d2f4b 100644
--- a/core/modules/user/src/Entity/User.php
+++ b/core/modules/user/src/Entity/User.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\EntityChangedTrait;
+use Drupal\Core\Entity\EntityCreatedTrait;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Field\BaseFieldDefinition;
@@ -59,6 +60,7 @@
 class User extends ContentEntityBase implements UserInterface {
 
   use EntityChangedTrait;
+  use EntityCreatedTrait;
 
   /**
    * Stores a reference for a reusable anonymous user entity.
@@ -234,13 +236,6 @@ public function setEmail($mail) {
   /**
    * {@inheritdoc}
    */
-  public function getCreatedTime() {
-    return $this->get('created')->value;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function getLastAccessedTime() {
     return $this->get('access')->value;
   }
@@ -429,7 +424,8 @@ public static function getAnonymousUser() {
    */
   public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
     /** @var \Drupal\Core\Field\BaseFieldDefinition[] $fields */
-    $fields = parent::baseFieldDefinitions($entity_type);
+    $fields = parent::baseFieldDefinitions($entity_type)
+      + static::createdBaseFieldDefinitions($entity_type);
 
     $fields['uid']->setLabel(t('User ID'))
       ->setDescription(t('The user ID.'));
@@ -504,9 +500,9 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ->setDescription(t('Whether the user is active or blocked.'))
       ->setDefaultValue(FALSE);
 
-    $fields['created'] = BaseFieldDefinition::create('created')
-      ->setLabel(t('Created'))
-      ->setDescription(t('The time that the user was created.'));
+    // Override the default description of 'created' base field.
+    // @see \Drupal\Core\Entity\EntityCreatedTrait::createdBaseFieldDefinitions()
+    $fields['created']->setDescription(t('The time that the user was created.'));
 
     $fields['changed'] = BaseFieldDefinition::create('changed')
       ->setLabel(t('Changed'))
diff --git a/core/modules/user/src/UserInterface.php b/core/modules/user/src/UserInterface.php
index 6919e0d7b4..af0c7d89f3 100644
--- a/core/modules/user/src/UserInterface.php
+++ b/core/modules/user/src/UserInterface.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Entity\EntityChangedInterface;
 use Drupal\Core\Entity\ContentEntityInterface;
+use Drupal\Core\Entity\EntityCreatedInterface;
 use Drupal\Core\Session\AccountInterface;
 
 /**
@@ -11,7 +12,7 @@
  *
  * @ingroup user_api
  */
-interface UserInterface extends ContentEntityInterface, EntityChangedInterface, AccountInterface {
+interface UserInterface extends ContentEntityInterface, EntityChangedInterface, EntityCreatedInterface, AccountInterface {
 
   /**
    * Maximum length of username text field.
@@ -119,14 +120,6 @@ public function setPassword($password);
   public function setEmail($mail);
 
   /**
-   * Returns the creation time of the user as a UNIX timestamp.
-   *
-   * @return int
-   *   Timestamp of the creation date.
-   */
-  public function getCreatedTime();
-
-  /**
    * Sets the UNIX timestamp when the user last accessed the site..
    *
    * @param int $timestamp
