使用date-fns比较两个UTC日期

7

我正在尝试使用date-fns比较两个UTC格式的日期,但是不成功。这两个值看起来相同,但是isEquals()函数返回false。

下面代码的目的是搜索标记的日程安排,并检查它们是否符合数组range的时间,如果存在兼容的日程安排,则将其插入常量日期并返回对象。

import React, { useState, useEffect } from 'react';
import { utcToZonedTime } from 'date-fns-tz';
import {
  format,
  setHours,
  setMinutes,
  setSeconds,
  isBefore,
  isEqual,
  parseISO,
} from 'date-fns';
import enUS from 'date-fns/locale/en-US';

import api from '~/services/api';

const range = [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];

export default function Dashboard() {
  const [date, setDate] = useState(new Date());

  useEffect(() => {
    async function loadSchedule() {
      const response = await api.get('schedule', {
        params: { date },
      });

      const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;

      const data = range.map((hour) => {
        const checkDate = setSeconds(setMinutes(setHours(date, hour), 0), 0);
        const compareDate = utcToZonedTime(checkDate, timezone);

        return {
          time: `${hour}:00h`,
          past: isBefore(compareDate, new Date()),
          appointment: response.data.find((appoint) =>
            isEqual(parseISO(appoint.date), compareDate)
          ),
        };
      });

      setSchedule(data);
    }

    loadSchedule();
  }, [date]);

}

我写了一个测试代码,在Reactotron上打印出结果,以下是打印的值:

console.tron.log(`${isEqual(parseISO(response.data[1].date), 
                   compareDate)}\n
                   ${parseISO(response.data[1].date)}\n${compareDate}`);

结果:

false
Wed Jun 10 2020 19:00:00 GMT-0300 (Brasilia Standard Time)
Wed Jun 10 2020 19:00:00 GMT-0300 (Brasilia Standard Time)

每个日期的实际值:

console.tron.log(`${response.data[1].date}\n${compareDate}`);

2020-06-10T22:00:00.000Z
Wed Jun 10 2020 20:00:00 GMT-0300 (Brasilia Standard Time)

但如果我只打印compareDate变量的值,它会改变格式:

console.tron.log(compareDate);

2020-06-10T21:00:00.002Z

一个值是否有非零毫秒?在日期上记录.toISOString()以进行检查。 - Matt Johnson-Pint
我使用partner是因为时区的问题。我尝试使用.toISOString(),但出现了以下错误:Unhandled Rejection (TypeError): response.data[1].date.toISOString is not a function测试代码如下:console.tron.log(${parseISO(response.data[1].date)}\n${response.data[1].date.toISOString()}); - Leonardo Freua
1个回答

7
date-fnsisEqual() 函数在比较两个日期时会考虑毫秒值,与评论中的问题相符。
这一信息也可以在 date-fns isEqual() 文档 中找到,例如:
// Are 2 July 2014 06:30:45.000 and 2 July 2014 06:30:45.500 equal?

var result = isEqual(
  new Date(2014, 6, 2, 6, 30, 45, 0),
  new Date(2014, 6, 2, 6, 30, 45, 500)
)
// it returns false`

你应该从 date-fns 导入 setMilliseconds(),并在设置 checkDate 值的那一行中使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接