diff --git modules/system/system.test modules/system/system.test
index 549df44..136c52a 100644
--- modules/system/system.test
+++ modules/system/system.test
@@ -923,6 +923,103 @@ class SiteMaintenanceTestCase extends DrupalWebTestCase {
 }
 
 /**
+ * Tests generic date format and date type functions and hooks
+ */
+class DateTimeUnitTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Date and time unit tests',
+      'description' => 'Performs tests on date format and date type functions and hooks.',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('date_test');
+  }
+
+  /**
+   * Test that system_get_date_formats() returns module defined date formats.
+   */
+  function testSystemGetDateFormats() {
+    // Get a list of all known date formats.
+    $formats = system_get_date_formats();
+
+    // Verify the existence of the very short date format provided by the
+    // date_test module.
+    $very_short_format = $formats['date_test_very_short']['F Y'];
+    // In testing each date format, we unset the date format ID since we cannot
+    // know this value in advance.
+    unset($very_short_format['dfid']);
+    $expected_very_short_format = array(
+      'format' => 'F Y',
+      'type' => 'date_test_very_short',
+      'locales' => array(),
+      'locked' => TRUE,
+      'module' => 'date_test',
+      'is_new' => FALSE,
+    );
+    $this->assertEqual($very_short_format, $expected_very_short_format, t('Information about the %type date format %format was provided.', array('%type' => 'date_test_very_short', '%format' => 'F Y')));
+
+    // Verify the existence of the extra long date format provided by the
+    // date_test module. This format has been altered by
+    // hook_date_format_types_alter() and hook_date_formats_alter().
+    $extra_long_formats = system_get_date_formats('date_test_extra_long');
+    $extra_long_format = $extra_long_formats['l jS F Y h:i:sa'];
+    unset($extra_long_format['dfid']);
+    $expected_extra_long_format = array(
+      'format' => 'l jS F Y h:i:sa',
+      'type' => 'date_test_extra_long',
+      'locales' => array('en', 'en-us', 'en-ca'),
+      'locked' => TRUE,
+      'module' => 'date_test',
+      'is_new' => FALSE
+    );
+    $this->assertEqual($extra_long_format, $expected_extra_long_format, t('Information about the %type date format %format was provided.', array('%type' => 'date_test_extra_long', '%format' => 'l jS F Y h:i:sa')));
+
+    // This date format does not exist so the response should be FALSE.
+    $does_not_exist_formats = system_get_date_formats('does_not_exist');
+    $this->assertFalse($does_not_exist_formats, t('No information was date format information provided for a non-existent date type.'));
+  }
+
+  /**
+   * Test that system_get_date_types() returns module defined date types.
+   */
+  function testSystemGetDateTypes() {
+    // Get a list of all known date types.
+    $types = system_get_date_types();
+
+    // Verify the existence of the very short date type provided by the
+    // date_test module.
+    $expected_very_short_type = array(
+      'type' => 'date_test_very_short',
+      'title' => t('Date test very short'),
+      'locked' => TRUE,
+      'module' => 'date_test',
+      'is_new' => FALSE,
+    );
+    $this->assertEqual($types['date_test_very_short'], $expected_very_short_type, t('System provided %type date type found.', array('%type' => 'date_test_very_short')));
+
+    // Verify the existence of the extra long date type provided by the
+    // date_test module. This format has been altered by
+    // hook_date_format_types_alter().
+    $extra_long_type = system_get_date_types('date_test_extra_long');
+    $expected_extra_long_type = array(
+      'type' => 'date_test_extra_long',
+      'title' => t('Date test extra long'),
+      'locked' => TRUE,
+      'module' => 'date_test',
+      'is_new' => FALSE,
+    );
+    $this->assertEqual($extra_long_type, $expected_extra_long_type, t('System provided %type date type found.', array('%type' => 'date_test_extra_long')));
+
+    // This date type does not exist so the response should be FALSE.
+    $type_does_not_exist = system_get_date_types('does_not_exist');
+    $this->assertFalse($type_does_not_exist, t('No date type information provided for a non-existent date type.'));
+  }
+}
+
+/**
  * Tests generic date and time handling capabilities of Drupal.
  */
 class DateTimeFunctionalTest extends DrupalWebTestCase {
diff --git modules/system/tests/date_test.info modules/system/tests/date_test.info
new file mode 100644
index 0000000..35a5f36
--- /dev/null
+++ modules/system/tests/date_test.info
@@ -0,0 +1,7 @@
+; $Id$
+name = "System module date tests"
+description = "Support module for date testing."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
diff --git modules/system/tests/date_test.module modules/system/tests/date_test.module
new file mode 100644
index 0000000..caf4131
--- /dev/null
+++ modules/system/tests/date_test.module
@@ -0,0 +1,49 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Dummy module implementing date types and date formats for testing.
+ */
+
+/**
+ * Implements hook_date_format_types().
+ */
+function date_test_date_format_types() {
+  return array(
+    'date_test_very_short' => t('Date test very short'),
+    'date_test_extra_long' => t('Unknown'),
+  );
+}
+
+/**
+ * Implements hook_date_format_types_alter().
+ */
+function date_test_date_format_types_alter(&$types) {
+  $types['date_test_extra_long']['title'] = t('Date test extra long');
+}
+
+/*
+ * Implements hook_date_formats().
+ */
+function date_test_date_formats() {
+  return array(
+    array(
+      'type' => 'date_test_very_short',
+      'format' => 'F Y',
+      'locales' => array(),
+    ),
+    array(
+      'type' => 'date_test_extra_long',
+      'format' => 'l jS F Y h:i:sa',
+      'locales' => array('en', 'en-us'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_date_formats_alter().
+ */
+function date_test_date_formats_alter(&$formats) {
+  $formats['date_test_extra_long']['l jS F Y h:i:sa']['locales'][] = 'en-ca';
+}
