You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

时区排序需求调整:按GMT-、无偏移、GMT+顺序排列

时区数组排序修正方案

问题说明

需要将时区数组按以下固定顺序排序:

  • 带GMT-偏移的时区
  • 无正负偏移的中性时区(即(GMT)开头的项)
  • 带GMT+偏移的时区

现有排序代码会将中性时区排在最后,不符合需求,需调整排序逻辑。

原代码问题分析

原正则仅匹配带GMT+/GMT-的时区,中性时区的label无法匹配正则,导致parseFloat返回NaN。在排序比较中,NaN与任何数值比较结果都是false,最终中性时区被默认放到数组末尾。

修正后的代码

const SortTimezoneCompare = (data) => {
  return data.sort((a, b) => {
    // 标记时区类型:负偏移=0,中性=1,正偏移=2
    const getZoneType = (label) => {
      if (label.includes('GMT-')) return 0;
      if (label.startsWith('(GMT)')) return 1;
      if (label.includes('GMT+')) return 2;
      return 1;
    };

    const aType = getZoneType(a.label);
    const bType = getZoneType(b.label);

    // 先按类型排序,类型不同直接返回差值
    if (aType !== bType) {
      return aType - bType;
    }

    // 同类型下,解析偏移值进行精细排序
    const parseOffset = (label) => {
      const match = label.match(/^\(GMT([+-]?)(\d{1,2}):?(\d{1,2})?\)/);
      if (!match) return 0;
      const sign = match[1] === '-' ? -1 : 1;
      const hours = parseInt(match[2] || 0, 10);
      const minutes = parseInt(match[3] || 0, 10);
      return sign * (hours + minutes / 60);
    };

    const aOffset = parseOffset(a.label);
    const bOffset = parseOffset(b.label);

    return aOffset - bOffset;
  });
};

// 测试数组
const array = [
  {
    "defaultOrder": 34,
    "label": "(GMT-01:00) Cape Verde Islands",
    "codeId": 1218,
    "code": "CVT",
    "codeDesc": "(GMT-01:00) Cape Verde Islands",
    "codeQualifier": "Time_Zone_Cd"
  },
  {
    "defaultOrder": 41,
    "label": "(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna",
    "codeId": 297,
    "code": "CET",
    "codeDesc": "(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna",
    "codeQualifier": "Time_Zone_Cd"
  },
  {
    "defaultOrder": 40,
    "label": "(GMT) Monrovia, Reykjavik",
    "codeId": 1220,
    "code": "GMT02",
    "codeDesc": "(GMT) Monrovia, Reykjavik",
    "codeQualifier": "Time_Zone_Cd"
  },
  {
    "defaultOrder": 33,
    "label": "(GMT-02:00) Mid-Atlantic",
    "codeId": 1219,
    "code": "GST",
    "codeDesc": "(GMT-02:00) Mid-Atlantic",
    "codeQualifier": "Time_Zone_Cd"
  },
  {
    "defaultOrder": 42,
    "label": "(GMT+02:00) Athens, Bucharest",
    "codeId": 300,
    "code": "EET",
    "codeDesc": "(GMT+02:00) Athens, Bucharest",
    "codeQualifier": "Time_Zone_Cd"
  }
];

const sortedArray = SortTimezoneCompare(array);
console.log(sortedArray);

代码逻辑说明

  1. 类型分组排序:通过getZoneType给每个时区分配类型标识,确保负偏移(0)→ 中性(1)→ 正偏移(2)的顺序优先级。
  2. 同类型精细排序:
    • 负偏移时区:按偏移绝对值从大到小排列(如GMT-02排在GMT-01前)
    • 正偏移时区:按偏移值从小到大排列(如GMT+01排在GMT+02前)
    • 中性时区统一归为偏移值0,保持原有相对顺序(若有多个中性时区)

验证结果

运行代码后,输出顺序为:

  1. (GMT-02:00) Mid-Atlantic
  2. (GMT-01:00) Cape Verde Islands
  3. (GMT) Monrovia, Reykjavik
  4. (GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna
  5. (GMT+02:00) Athens, Bucharest

完全符合需求排序规则。

内容的提问来源于stack exchange,提问作者3gwebtrain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 14:45:56