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

Leo*_*eua 8 javascript timezone date react-native date-fns

我正在尝试将 UTC 格式的两个日期与date-fns进行比较,但我没有得到它。两个值 \xe2\x80\x8b\xe2\x80\x8b 看起来相同,但 isEquals ()函数返回 false 进行比较。

\n\n

下面代码的目的是搜索标记的时间表并检查它们是否符合数组范围的时间的时间,如果有兼容的时间表,则通过将其插入到常量日期中来返回对象

\n\n
import React, { useState, useEffect } from 'react';\nimport { utcToZonedTime } from 'date-fns-tz';\nimport {\n  format,\n  setHours,\n  setMinutes,\n  setSeconds,\n  isBefore,\n  isEqual,\n  parseISO,\n} from 'date-fns';\nimport enUS from 'date-fns/locale/en-US';\n\nimport api from '~/services/api';\n\nconst range = [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];\n\nexport default function Dashboard() {\n  const [date, setDate] = useState(new Date());\n\n  useEffect(() => {\n    async function loadSchedule() {\n      const response = await api.get('schedule', {\n        params: { date },\n      });\n\n      const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n      const data = range.map((hour) => {\n        const checkDate = setSeconds(setMinutes(setHours(date, hour), 0), 0);\n        const compareDate = utcToZonedTime(checkDate, timezone);\n\n        return {\n          time: `${hour}:00h`,\n          past: isBefore(compareDate, new Date()),\n          appointment: response.data.find((appoint) =>\n            isEqual(parseISO(appoint.date), compareDate)\n          ),\n        };\n      });\n\n      setSchedule(data);\n    }\n\n    loadSchedule();\n  }, [date]);\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我编写了一个测试代码来在Reactotron上打印结果,下面是打印值:

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

结果:

\n\n
false\nWed Jun 10 2020 19:00:00 GMT-0300 (Brasilia Standard Time)\nWed Jun 10 2020 19:00:00 GMT-0300 (Brasilia Standard Time)\n
Run Code Online (Sandbox Code Playgroud)\n\n

每个日期的实际值 \xe2\x80\x8b\xe2\x80\x8b:

\n\n
console.tron.log(`${response.data[1].date}\\n${compareDate}`);\n
Run Code Online (Sandbox Code Playgroud)\n\n
2020-06-10T22:00:00.000Z\nWed Jun 10 2020 20:00:00 GMT-0300 (Brasilia Standard Time)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
console.tron.log(compareDate);\n
Run Code Online (Sandbox Code Playgroud)\n\n
2020-06-10T21:00:00.002Z\n
Run Code Online (Sandbox Code Playgroud)\n

All*_*lan 8

date-fns正如评论中所质疑的,函数isEqual()还考虑了毫秒值。

此信息也可以在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`
Run Code Online (Sandbox Code Playgroud)

您应该setMilliseconds()date-fns设置值的行导入并使用它checkDate