You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Dayjs+React实现每周五0点倒计时及触发提醒

每周五凌晨0点循环倒计时器实现问题

我需要实现一个每周五凌晨0点的倒计时器,到达0点时触发礼品提醒。最初尝试用原生JavaScript实现但未成功,随后改用react-countdown库结合Dayjs仍无法实现需求。当前面临的问题是:要让计数器从周五凌晨00:01开始,倒计时至下周五凌晨00:00,并每周循环。

以下是我使用Dayjs和react-countdown库的尝试代码:

CountTImer 组件代码

import { useEffect, useState } from "react";
import Countdown from "react-countdown";
import dayjs from "dayjs";
import { v4 as uuidv4 } from "uuid";
import "@/components/Utils/Weekday";
import HomeTimer from "./HomeTimer";
import "./isoWeekday";
import "./weekday";

const CountTImer = () => {
  const [theNextFriday, setTheNextFriday] = useState("null");
  const [countDownStop, setCountDownStop] = useState(false);
  const [keyForIteratingTime, setKeyForIteratingTime] = useState("");


  const nextWeekthursday4_59pm = dayjs() - dayjs().add(1, "week").day(1).hour(23).minute(59).second(59);
  const thisWeekthursday4_59pm = dayjs() - dayjs().day(1).hour(23).minute(59).second(59);
  const everyFriday12_00am = dayjs() - dayjs().day(2).hour(0).minute(1).second(1);
  useEffect(() => {
    const Interval = setInterval(() => {
      if (dayjs() < Math.abs(everyFriday12_00am) || dayjs() === Math.abs(everyFriday12_00am)) {
        setTheNextFriday(Math.abs(nextWeekthursday4_59pm));
      } else {
        setTheNextFriday(Math.abs(thisWeekthursday4_59pm));
      }
    }, 1000);
    return () => clearInterval(Interval);
  }, [nextWeekthursday4_59pm || thisWeekthursday4_59pm || everyFriday12_00am]);

  const Completionist = () => {
    setCountDownStop(true);
    setKeyForIteratingTime(uuidv4());
  };

  const renderer = ({ days, hours, minutes, seconds, completed }) => {
    if (completed) {
      return <Completionist />;
    } else {
      // Render a countdown
      return (
        <>
          <HomeTimer
            daysLeftToSelectWinner={days}
            hoursLeftToSelectWinner={hours}
            minutesLeftToSelectWinner={minutes}
            secondsLeftToSelectWinner={seconds}
          />
        </>
      );
    }
  };

  return (
    <div>
      <Countdown renderer={renderer} key={`${keyForIteratingTime}`} date={Date.now() + theNextFriday} />
    </div>
  );
};

export default CountTImer;

HomeTimer 组件代码

import { zeroPad } from "react-countdown";
import Parallax from "../Utils/Parallax";

const HomeTimer = ({
  daysLeftToSelectWinner,
  hoursLeftToSelectWinner,
  minutesLeftToSelectWinner,
  secondsLeftToSelectWinner,
}) => {
  return (
    <div>
      {daysLeftToSelectWinner && hoursLeftToSelectWinner && minutesLeftToSelectWinner && secondsLeftToSelectWinner && (
          <div >
              <div>
                <p > {zeroPad(daysLeftToSelectWinner)}</p>
                <p>DAYS</p>
              </div>
              <div >
                <p>{zeroPad(hoursLeftToSelectWinner)}</p>
                <p>HOURS</p>
              </div>
              <div >
                <p>{zeroPad(minutesLeftToSelectWinner)}</p>
                <p>MINUTES</p>
              </div>
              <div>
                <p>{zeroPad(secondsLeftToSelectWinner)}</p>
                <p>SECONDS</p>
              </div>
        </div>
      )}
    </div>
  );
};

export default HomeTimer;

当倒计时归零时,keyForIteratingTime(uuid)会更新,计时器重新启动。

内容的提问来源于stack exchange,提问作者Paulliano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 14:54:15