Override theme for date field output?
With the help of hook_theme_registry_alter you can override(actually by passing) any theme function.

Usually module's will define their theme functions in hook_theme(), however using hook_theme_registry_alter you can alter those information.

For your case below code will achieve the desired functionality,

/**
 * Implements hook_theme_registry_alter().
 */
function &lt;my_module&gt;_theme_registry_alter(&amp;$theme_registry) {
  if (isset($theme_registry['date_display_range'])) {
    $theme_registry['date_display_range']['function'] = 'theme_custom_date_display_range';
  }
}

/**
 * Returns HTML for a date element formatted as a range.
 */
function theme_custom_date_display_range($variables) {
  $date1 = $variables['date1'];
  $date2 = $variables['date2'];
  $timezone = $variables['timezone'];
  $attributes_start = $variables['attributes_start'];
  $attributes_end = $variables['attributes_end'];

  // Wrap the result with the attributes.
  return t('!start-date - !end-date', array(
    '!start-date' =&gt; '&lt;span class="date-display-start"' . drupal_attributes($attributes_start) . '&gt;' . $date1 . '&lt;/span&gt;',
    '!end-date' =&gt; '&lt;span class="date-display-end"' . drupal_attributes($attributes_end) . '&gt;' . $date2 . $timezone . '&lt;/span&gt;',
  ));
}


So whenever you call theme('date_display_range', $variables), theme_custom_date_display_range() function will be invoked instead of theme_date_display_range().

Don't forget to clear the caches after adding hook_theme_registry_alter