如何对时刻时区列表进行排序?

How to sort moment-timezone list?

我想在下拉菜单中以升序显示时刻-时区列表。默认情况下,这些按字母顺序排序。但是,我的要求是按 GMT 升序对它们进行排序。

酸痛前:

[
  '(GMT+00:00) Africa/Abidjan',
  '(GMT+00:00) Africa/Accra',
  '(GMT+03:00) Africa/Addis_Ababa',
  '(GMT+01:00) Africa/Algiers',
  '(GMT+03:00) Africa/Asmara',
  '(GMT+03:00) Africa/Asmera',
  '(GMT+00:00) Africa/Bamako',
  '(GMT+01:00) Africa/Bangui',
]

排序后:

[
  '(GMT+00:00) Africa/Abidjan',
  '(GMT+00:00) Africa/Accra',
  '(GMT+00:00) Africa/Bamako',
  '(GMT+01:00) Africa/Algiers',
  '(GMT+01:00) Africa/Bangui',
  '(GMT+03:00) Africa/Addis_Ababa',
  '(GMT+03:00) Africa/Asmera',
  '(GMT+03:00) Africa/Asmara',
]

你可以这样得到排序后的列表

const timeZones = moment.tz.names();

const getTimeZoneList = () =>
  timeZones.map(
    (t, i) => `(GMT${moment.tz(timeZones[i]).format("Z")}) ${timeZones[i]}`
  );

const sortByGmt = () => {
  const timeZone = getTimeZoneList();
  return timeZone.sort((a, b) => {
    const re = /^\(GMT([+-]\d{1,2}):(\d{1,2})\).*$/;
    const aOffset = parseFloat(a.replace(re, "."));
    const bOffset = parseFloat(b.replace(re, "."));
    return aOffset < bOffset ? -1 : aOffset > bOffset ? 1 : 0;
  });
};
console.log(sortByGmt())
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment-with-locales.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.27/moment-timezone-with-data-2012-2022.min.js"></script>

比你矮,Ashik。无需两次访问数组中的时区

const getTimeZoneList = moment.tz.names()
  .map(t => `(GMT${moment.tz(t).format("Z")}) ${t}`);
const sortByZone = (a,b) => { 
  let [ahh,amm] = a.split("GMT")[1].split(")")[0].split(":"); 
  let [bhh,bmm] = b.split("GMT")[1].split(")")[0].split(":");
  return (+ahh*60+amm) - (+bhh*60+bmm)
};
console.log(getTimeZoneList.sort(sortByZone))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment-with-locales.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.27/moment-timezone-with-data-2012-2022.min.js"></script>

如果我们有 Moment.js 时区对象数组 (name, value) 或任何其他具有 GMT 值的时区对象数组 HARDCODED 的情况的解决方案我们想根据 GMT 值对它们进行排序。

export const Timezones = [
  {
    name: "(GMT-7:00) America/Denver",
    value: "America/Denver"
  },
  {
    name: "(GMT+3:00) Africa/Asmara",
    value: "Africa/Asmara"
  },
  {
    name: "(GMT-11:00) Pacific/Midway",
    value: "Pacific/Midway"
  }
];


然后我们可以对这个数组进行排序
timezones.sort( this.compare );

 compare( a, b ) {
     
    var first = a.name.substring(a.name.indexOf('T')+1,a.name.indexOf(")"));
    first.replace(/^"+:"+$/g, '');

    var second = b.name.substring(b.name.indexOf('T')+1,b.name.indexOf(")"));
    first.replace(/^"+:"+$/g, '');

    if ( parseFloat(first) < parseFloat(second) ){
        return -1;
      
    }
    if ( parseFloat(first) > parseFloat(second) ){
      return 1;
    }
    return 0;
  }

更简单地说,utcOffset() 方法提供与 GMT 相比的偏移量:

const result = moment.tz.names()
  .sort((a, b) => moment.tz(a).utcOffset() - moment.tz(b).utcOffset())
  .map(timezone => `(GMT${moment.tz(timezone).format("Z")}) ${timezone}`)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment-with-locales.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.27/moment-timezone-with-data-2012-2022.min.js"></script>