PHP时区列表不一致

时间:2015-04-28 17:31:44

标签: php date datetime drupal timezone

所以我使用drupal 6的date_timezone_names来生成时区列表:

/**
 * A translated array of timezone names.
 * Cache the untranslated array, make the translated array a static variable.
 *
 * @param $required
 *   If not required, returned array will include a blank value.
 * @return
 *   an array of timezone names
 */
function date_timezone_names($required = FALSE, $refresh = FALSE) {
  static $zonenames;
  if (empty($zonenames) || $refresh) {
    $cached = cache_get('date_timezone_identifiers_list');
    $zonenames = !empty($cached) ? $cached->data : array();
    if ($refresh || empty($cached) || empty($zonenames)) {
      $data = timezone_identifiers_list(DateTimeZone::ALL_WITH_BC);
      // Use include instead of include once in case the function gets
      // refreshed via devel or other API and is called more than once.
      if (module_exists('date_php4')) {
        include('./'. drupal_get_path('module', 'date_php4') .'/date_php4_missing_data.inc');
      }
      foreach ($data as $delta => $zone) {
        // Because many time zones exist in PHP only for backward
        // compatibility reasons and should not be used, the list is
        // filtered by a regular expression.
        if (preg_match('!^((Africa|America|Antarctica|Arctic|Asia|Atlantic|Australia|Europe|Indian|Pacific)/|UTC$)!', $zone)) {
          // https://github.com/Br3nda/drupal-module-date/blob/master/date_api.module
          $zonenames[$zone] = $zone;
        }
      }
      // If using PHP4, filter the list down to only the timezones
      // the PHP4 wrapper has data for.
      if (module_exists('date_php4')) {
        foreach ($missing_timezone_data as $zone) {
          unset($zonenames[$zone]);
        }
      }

      // If using Event, further filter the list down to only
      // zones that exist in the event module.
      if (module_exists('event') && db_table_exists('event_timezones')) {
        $result = db_query("SELECT name FROM {event_timezones} ORDER BY name");
        $names = array();
        while ($row = db_fetch_array($result)) {
          $names[] = str_replace(' ', '_', $row['name']);
        }
        foreach ($zonenames as $name => $zone) {
          if (!in_array($name, $names)) {
            unset($zonenames[$name]);
          }
        }
      }
      if (!empty($zonenames)) {
        cache_set('date_timezone_identifiers_list', $zonenames);
      }
    }
    foreach ($zonenames as $zone) {
      $zonenames[$zone] = t($zone);
    }
  }
  $none = array('' => '');
  return !$required ? $none + $zonenames : $zonenames;
}

请注意,最终会调用timezone_identifiers_list(DateTimeZone::ALL_WITH_BC)

但是这有时会返回不一致的列表...有时时间区域如亚洲/赤塔(GMT + 8)出现在列表中...其他时区,列表中不存在该时区....还要注意亚洲/赤塔不在date_php4_missing_data.inc

知道为什么会这样吗?在什么情况下$data = timezone_identifiers_list(DateTimeZone::ALL_WITH_BC);会返回不一致的时区列表?

有时出现的另一个时区有时不会出现:Asia / Srednekolymsk ...请注意,这也不在date_php4_missing_data.inc

1 个答案:

答案 0 :(得分:0)

2014f(announcement here)中将Asia/ChitaAsia/Srednekolymsk添加到tzdb。此更新对应于PHP的timezonedb版本2014.6。

您可以查看timezone_version_get()安装的当前版本的timezonedb,记录为here

完全有可能让PHP安装具有不同版本的timezonedb,无论是由于运行旧版本的PHP本身,还是手动更新timezonedb PECL包。如果您关心最新的时区,那么您应该订阅IANA tz announcements mailing list, 并根据需要将相应的更新应用于PHP timezonedb