如何在数组中筛选与指定日期同天的时间并返回时分?
解决方案
问题出在直接用formatISO匹配时,时区差异导致日期字符串不对应。可以用date-fns的日期判断方法忽略时间和时区干扰,只比较日期部分,具体实现如下:
核心思路
- 将目标起始日期和数组中的ISO字符串都转为
Date对象 - 用
isSameDay方法判断两个日期是否为同一天(该方法会自动处理时区逻辑) - 对符合条件的日期,提取时分格式的字符串
代码实现
首先导入所需的date-fns方法:
import { isSameDay, format } from 'date-fns';
然后编写处理逻辑:
const array = [ "2023-03-14T13:00:00.000Z", "2023-03-13T12:30:00.000Z", "2023-03-06T13:00:00.000Z", "2023-04-24T11:30:00.000Z", "2023-03-24T13:00:00.000Z", ]; // 把给定的起始时间转为Date对象 const targetDate = new Date("Thu Mar 24 2023 00:00:00 GMT+0100"); // 筛选同天日期并提取时分 const matchedTimeList = array .map(isoStr => new Date(isoStr)) .filter(date => isSameDay(date, targetDate)) .map(date => format(date, 'HH:mm')); console.log(matchedTimeList); // 输出: ['13:00']
补充说明
- 之前用
formatISO失败的原因:该方法会将目标日期转为UTC时区的ISO字符串(比如GMT+0100的2023-03-24 00:00会变成2023-03-23T23:00:00.000Z),和数组中2023-03-24T13:00:00.000Z的日期部分不匹配。 - 如果需要基于UTC时区判断同一天,可以结合
date-fns-tz的时区处理方法:
import { isSameDay, format, zonedTimeToUtc } from 'date-fns-tz'; // 转换目标日期为UTC时区的日期对象 const targetUtcDate = zonedTimeToUtc(targetDate, 'Europe/Paris'); const matchedTimeList = array .map(isoStr => new Date(isoStr)) .filter(date => isSameDay(date, targetUtcDate, { timeZone: 'UTC' })) .map(date => format(date, 'HH:mm'));
内容的提问来源于stack exchange,提问作者user3142695
相关产品推荐
相关产品推荐

