Je souhaite afficher la liste moment-fuseau horaire par ordre croissant dans un menu déroulant. Par défaut, ceux-ci sont triés par ordre alphabétique. Mais, mon exigence est de les trier par GMT dans l'ordre croissant.
avant le soring:
[ '(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', ]
après le tri:
[ '(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', ]
3 Réponses :
Vous pouvez obtenir la liste triée en faisant ceci
<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>
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, "$1.$2")); const bOffset = parseFloat(b.replace(re, "$1.$2")); return aOffset < bOffset ? -1 : aOffset > bOffset ? 1 : 0; }); }; console.log(sortByGmt())
Inutilement complexe. Voir ici stackoverflow.com/a/60078377/295783
Je n'ai pas vu que tu as répondu à ta propre question;)
Plus court que le vôtre, Ashik. Pas besoin d'accéder deux fois au fuseau horaire à partir du tableau
<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>
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))
Solution pour le cas si nous avons Moment.js timezone Tableau d'objets (nom, valeur), ou tout autre Timezone Tableau d'objets avec des valeurs GMT HARDCODED avec nous et que nous voulons appliquer le tri sur les sur les valeurs GMT.
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; }
Ensuite, nous pouvons trier ce tableau par
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" } ];
en fait, c'est un grand tableau. donc je ne l'ai pas donné. de toute façon maintenant il est édité. Je pense que cela a du sens maintenant.