diff --git a/includes/common.inc b/includes/common.inc
index de31897..44c36f0 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -1991,6 +1991,14 @@ function format_date($timestamp, $type = 'medium', $format = '', $timezone = NUL
       $format = variable_get('date_format_long', 'l, F j, Y - H:i');
       break;
 
+    case 'date':
+      $format = variable_get('date_format_date', 'l, F j, Y');
+      break;
+
+    case 'time':
+      $format = variable_get('date_format_long', 'H:i');
+      break;
+
     case 'custom':
       // No change to format.
       break;
diff --git a/includes/date.inc b/includes/date.inc
index 01ab131..2a79621 100644
--- a/includes/date.inc
+++ b/includes/date.inc
@@ -192,5 +192,124 @@ function system_default_date_formats() {
     'locales' => array(),
   );
 
+  // Time only formats
+  $formats[] = array(
+    'type' => 'time',
+    'format' => 'g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'time',
+    'format' => 'H:i',
+    'locales' => array(),
+  );
+
+  // Date only formats
+  $formats[] = array(
+    'type' => 'date',
+    'format' => 'd.m.Y',
+    'locales' => array('de-ch', 'de-de', 'de-lu', 'fi-fi', 'fr-ch', 'is-is', 'pl-pl', 'ro-ro', 'ru-ru'),
+  );
+  $formats[] = array(
+    'type' => 'date',
+    'format' => 'm/d/Y',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'date',
+    'format' => 'd/m/Y',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'date',
+    'format' => 'Y/m/d',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'date',
+    'format' => 'M j Y',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'date',
+    'format' => 'j M Y',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'date',
+    'format' => 'Y M j',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'date',
+    'format' => 'F j, Y',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'date',
+    'format' => 'j F, Y',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'date',
+    'format' => 'Y, F j',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'date',
+    'format' => 'j F Y',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'date',
+    'format' => 'j. F Y',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'date',
+    'format' => 'D, Y-m-d',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'date',
+    'format' => 'D, m/d/Y',
+    'locales' => array('en-us'),
+  );
+  $formats[] = array(
+    'type' => 'date',
+    'format' => 'D, d/m/Y',
+    'locales' => array('en-gb', 'en-hk', 'en-ie', 'el-gr', 'es-es', 'fr-be', 'fr-fr', 'fr-lu', 'it-it', 'nl-be', 'pt-pt'),
+  );
+  $formats[] = array(
+    'type' => 'date',
+    'format' => 'D, Y/m/d',
+    'locales' => array('en-ca', 'fr-ca', 'no-no', 'sv-se'),
+  );
+  $formats[] = array(
+    'type' => 'date',
+    'format' => 'l, j F, Y',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'date',
+    'format' => 'l, Y,  F j',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'date',
+    'format' => 'l, F j, Y',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'date',
+    'format' => 'l, j F Y',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'date',
+    'format' => 'l, j. F Y',
+    'locales' => array(),
+  );
+
   return $formats;
 }
diff --git a/modules/profile/profile.module b/modules/profile/profile.module
index 39cf030..fac5d60 100644
--- a/modules/profile/profile.module
+++ b/modules/profile/profile.module
@@ -295,20 +295,8 @@ function profile_view_field($account, $field) {
       case 'url':
         return '<a href="' . check_url($value) . '">' . check_plain($value) . '</a>';
       case 'date':
-        $format = substr(variable_get('date_format_short', 'm/d/Y - H:i'), 0, 5);
-        // Note: Avoid PHP's date() because it does not handle dates before
-        // 1970 on Windows. This would make the date field useless for e.g.
-        // birthdays.
-        $replace = array(
-          'd' => sprintf('%02d', $value['day']),
-          'j' => $value['day'],
-          'm' => sprintf('%02d', $value['month']),
-          'M' => map_month($value['month']),
-          'Y' => $value['year'],
-          'H:i' => NULL,
-          'g:ia' => NULL,
-        );
-        return strtr($format, $replace);
+        // Use date_create() here to ensure years > 2038 and < 1901 do not fail.
+        return format_date(date_create("{$value['year']}-{$value['month']}-{$value['day']}")->format('U'), 'date');
       case 'list':
         $values = preg_split("/[,\n\r]/", $value);
         $fields = array();
diff --git a/modules/profile/profile.test b/modules/profile/profile.test
index 42a1a42..b9d752c 100644
--- a/modules/profile/profile.test
+++ b/modules/profile/profile.test
@@ -256,7 +256,7 @@ class ProfileTestDate extends ProfileTestCase {
   function testProfileDateField() {
     $this->drupalLogin($this->admin_user);
 
-    variable_set('date_format_short', 'm/d/Y - H:i');
+    variable_set('date_format_date', 'm/d/Y');
     $field = $this->createProfileField('date');
 
     // Set date to January 09, 1983
diff --git a/modules/system/system.module b/modules/system/system.module
index 2bbcd7f..2d1945c 100644
--- a/modules/system/system.module
+++ b/modules/system/system.module
@@ -3532,6 +3532,8 @@ function system_date_format_types() {
     'long' => t('Long'),
     'medium' => t('Medium'),
     'short' => t('Short'),
+    'date' => t('Date'),
+    'time' => t('Time'),
   );
 }
 
