@Alex10214

Как правильно сортировать массив с датами и разным часовым сдвигом??

Здравствуйте, у меня есть такой массив:
let test = [
      {num: 1, dateAndTime: 'Tue Jan 31 2023 11:47:08 GMT+0200 (Eastern European Standard Time)'},
      {num: 2, dateAndTime: 'Tue Jan 31 2023 10:14:28 GMT+0000 (Coordinated Universal Time)'},
      {num: 3, dateAndTime: 'Tue Jan 31 2023 12:13:13 GMT+0200 (Eastern European Standard Time)'}
     
    ];

test = test.sort((a: any, b: any) => Date.parse(b.dateAndTime) - Date.parse(a.dateAndTime));

console.log('test', test);


я его сортирую по дате, но что-то идет не так(

и я ожидаю что должно получиться так:
let test = [
      {num: 3, dateAndTime: 'Tue Jan 31 2023 12:13:13 GMT+0200 (Eastern European Standard Time)'},  
      {num: 1, dateAndTime: 'Tue Jan 31 2023 11:47:08 GMT+0200 (Eastern European Standard Time)'},
      {num: 2, dateAndTime: 'Tue Jan 31 2023 10:14:28 GMT+0000 (Coordinated Universal Time)'}
    ];


но получается так:

let test = [
      {num: 2, dateAndTime: 'Tue Jan 31 2023 10:14:28 GMT+0000 (Coordinated Universal Time)'},  
      {num: 3, dateAndTime: 'Tue Jan 31 2023 12:13:13 GMT+0200 (Eastern European Standard Time)'},  
      {num: 1, dateAndTime: 'Tue Jan 31 2023 11:47:08 GMT+0200 (Eastern European Standard Time)'}
     
    ];


есть догадки что может тайм зона играет злую шутку... Но это не решает мою проблему. Можете помочь пожалуйста с решением?
  • Вопрос задан
  • 52 просмотра
Решения вопроса 3
VoidVolker
@VoidVolker Куратор тега JavaScript
Dark side eye. А у нас печеньки! А у вас?
Для работы с датами использовать momentjs.
  1. Сначала распарсить даты (иначе при сортировке их придется парсить два-три раза)
  2. Для сортировки использовать moment().diff()
Ответ написан
sergiks
@sergiks Куратор тега JavaScript
♬♬
Сортирует правильно, с учётом временных зон. Именно в таком порядке произойдут эти события.

Если хочется проигнорировать часовые пояса и представить (зачем-то), что время у всех событий указано в одной общей временной зоне, то можно отрезать лишнее — брать часть строки до "GMT":
test.forEach(item => item.tsNoTZ = new Date(item.dateAndTime.substring(0, 24)));
test.sort((a, b) => b.tsNoTZ - a.tsNoTZ);
И лучше только однажды пройти по массиву и добавить каждому объекту новое поле, по которому потом сортировать.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Как вы в коде написали, так и сортируется, по убыванию таймстампа:
'Tue Jan 31 2023 10:14:28 GMT+0000 (Coordinated Universal Time)' => 1675160068000
'Tue Jan 31 2023 12:13:13 GMT+0200 (Eastern European Standard Time)' => 1675159993000
'Tue Jan 31 2023 11:47:08 GMT+0200 (Eastern European Standard Time)' => 1675158428000
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 03:52
1000 руб./за проект
19 апр. 2024, в 03:01
1000 руб./за проект
18 апр. 2024, в 21:56
2000 руб./за проект