1
votes

Comment trier la liste moment-fuseau horaire?

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',
]


1 commentaires

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.


3 Réponses :


0
votes

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())


2 commentaires

Inutilement complexe. Voir ici stackoverflow.com/a/60078377/295783


Je n'ai pas vu que tu as répondu à ta propre question;)



4
votes

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))


0 commentaires

1
votes

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"
  }
];


0 commentaires