【问题标题】:How to show time and date in realtime in React JS?如何在 React JS 中实时显示时间和日期?
【发布时间】:2020-11-22 22:45:48
【问题描述】:

简报:

您好,我创建了一个钩子useDate() 来显示当前时间和日期,如下所示:

interface ReturnDate {
  time: string;
  date: string;
  wish: string;
}

export const useDate = (): ReturnDate => {
  const locale = 'en';
  const today = new Date();

  const day = today.toLocaleDateString(locale, { weekday: 'long' });
  const date = `${day}, ${today.getDate()} ${today.toLocaleDateString(locale, { month: 'long' })}\n\n`;

  const hour = today.getHours();
  const wish = `Good ${(hour < 12 && 'Morning') || (hour < 17 && 'Afternoon') || 'Evening'}, `;

  const time = today.toLocaleTimeString(locale, { hour: 'numeric', hour12: true, minute: 'numeric' });

  return {
    date,
    time,
    wish,
  };
};

我在下面的组件中使用它,如下所示:

const ProfileGreetings: FC = () => {
  const { firstName } = useUserDetails();
  const { date, time, wish } = useDate();

  return (
    <div className="greetings-container">
      <h1>
        {wish}
        <PrimaryText text={`${firstName || ''}!`} />
      </h1>

      <div>
        <h3>
          {date}
          <br />
          {time}
        </h3>
      </div>
    </div>
  );
};

应用中的日期/时间格式:

8 月 2 日,星期日

晚上 11:54

问题陈述:

目前发生的情况是日期和时间在我刷新页面之前不会更新。有什么方法可以实时更新以下所有内容?

我正在考虑使用 每 1 分钟间隔一次来计算更新的时间和日期,但我真的不知道这是否是个好主意。我也不知道如何开始以及如何清除

谢谢! :)

【问题讨论】:

    标签: javascript reactjs date redux react-hooks


    【解决方案1】:

    由于您可以在自定义挂钩中使用挂钩,因此您可以创建一个间隔来每分钟更新一次,如下所示:

    
    export const useDate = () => {
      const locale = 'en';
      const [today, setDate] = React.useState(new Date()); // Save the current date to be able to trigger an update
    
      React.useEffect(() => {
          const timer = setInterval(() => { // Creates an interval which will update the current data every minute
          // This will trigger a rerender every component that uses the useDate hook.
          setDate(new Date());
        }, 60 * 1000);
        return () => {
          clearInterval(timer); // Return a funtion to clear the timer so that it will stop being called on unmount
        }
      }, []);
    
      const day = today.toLocaleDateString(locale, { weekday: 'long' });
      const date = `${day}, ${today.getDate()} ${today.toLocaleDateString(locale, { month: 'long' })}\n\n`;
    
      const hour = today.getHours();
      const wish = `Good ${(hour < 12 && 'Morning') || (hour < 17 && 'Afternoon') || 'Evening'}, `;
    
      const time = today.toLocaleTimeString(locale, { hour: 'numeric', hour12: true, minute: 'numeric' });
    
      return {
        date,
        time,
        wish,
      };
    };
    

    【讨论】:

    • 在为间隔选择持续时间时要记住的一点是可以容忍什么样的错误,因为如果组件在真正的分钟切换前一毫秒启动。这就是为什么许多人选择较小的持续时间,例如 15 秒或 1 秒,因为这将确保组件显示的时间准确到 +- 持续时间。
    • @jaredgorski 这绝对正确。此外,我在想什么让我们在 30 秒内说分钟将从 00:30 增加到 01:00。但是当我选择 60 秒作为间隔时,当我的组件中更新分钟时,实际的实时分钟是 01:30。因此,30 秒的错误。
    • @Domino987 该解决方案对我来说绝对有希望。我想知道是否可以将 return 语句转换为 useMemo 钩子。这可能吗?
    • 是的,我同意提到的时间问题,应该根据您的需要进行调整。也许尝试一些对你有用的时间。为什么需要 useMemo?您能否接受这个答案,以便其他人找到正确的解决方案。
    • 这里不用setInterval。 React 会在每次更新时运行效果,因此可以使用 setTimeout 代替。这也意味着这将略有漂移。更新不会每分钟都发生,而是每分钟加上重新运行效果所需的时间。这可能无关紧要,但要修复它,可以改为计算下一次更改的时间(msPerMin - (Date.now() % msPerMin))并将其提供给setTimeout
    【解决方案2】:

    我对此有一个想法。 我将在while 和动态睡眠上循环,currentTimecurrentTime + 1 second 以秒为单位的舍入之间的差异。你可以参考这个脚本。

    function getRealTime() {
      const currentTime = Date.now();
      console.log(new Date(Math.round(currentTime / 1000) * 1000), currentTime);
      return (Math.floor(currentTime / 1000) + 1) * 1000 - currentTime;
    }
    
    (async function () {
      let reduceTime = 0;
      while (true) {
        reduceTime = getRealTime();
        await sleep(reduceTime);
      }
    })()
    
    function sleep(ms) {
      return new Promise(resolve => setTimeout(resolve, ms));
    }

    【讨论】:

      【解决方案3】:
      import React from 'react';
      import ReactDom from 'react-dom';
      
      const date = new Date().toLocaleDateString();
      const time = new Date().toLocaleTimeString();
      
      ReactDom.render(
      <>
      <p>Today's date is {date}</p>
      <p>Today's time is {time}</p>
      </>
      , 
      document.getElementById('root'));
      
      Output
      
      Today's date is 8/14/2020
      
      Today's time is 7:42:01 PM
      

      【讨论】:

      • Rajan,你能解释一下它如何实时显示更新吗?
      猜你喜欢
      • 1970-01-01
      • 2022-11-19
      • 2019-04-24
      • 2013-07-13
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      相关资源
      最近更新 更多