如何对时刻时区列表进行排序?
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>
我想在下拉菜单中以升序显示时刻-时区列表。默认情况下,这些按字母顺序排序。但是,我的要求是按 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>