Override theme for date field output? I have a field that accepts a date range using the Date module.  This is the theme function for outputting the date (found in sites/all/modules/contrib/date/date.theme):

/**
 * Returns HTML for a date element formatted as a range.
 */
function theme_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 to !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;',
  ));
}


I somehow need to override that and replace the 'to' in the return with a hyphen... I know, it's nitpicky but it underlines a more important point - I honestly have no way to alter this.  I've tried overriding it in my template.php but that doesn't take.  I literally just copy and pasted this code but replaced theme in the function with the actual name for my theme.

So yeah... how do I alter this theme function "the Drupal way"?
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