在 React-Native 中转换回人类友好的计时器格式

Converting Back to Human-Friendly Timer Format in React-Native

我的一个反应本机组件中有一个计时器 运行。它使用以下代码按预期工作:

const visitItemCounter = (value) => {
  const [duration, setCounter] = useState(moment.duration(value).asMilliseconds());
  useEffect(() => {
    const timer = setInterval(() => {
      console.log('duration: ', duration);
      setCounter(duration => duration + 1000);
    }, 1000);
    return () => {
      clearInterval(timer);
    };
  }, []); 

  return (
    <View>
      <Text style={styles.texts.mediumText}>{ duration }</Text>
    </View>
  );
}

顺便说一句,在控制台中我看到以下内容,以毫秒为单位的值:

duration:  65849000

因此该值每秒增加 1000,如预期和期望的那样。

我现在想做的就是使用 moment.js 将显示从毫秒转换为典型的、人性化的格式。

现在,在最后的显示中,我想转换回人性化的格式。为此,我执行以下操作。我只是改了一行:

setCounter(duration => duration + 1000);

对此:

  setCounter(duration => moment.utc(duration + 1000).format('HH:mm:ss'));

所以整个块现在看起来像这样:

const visitItemCounter = (value) => {
  console.log('counter running with duration: ', value);
  // let duration = moment.utc(props.item.duration).format('HH:mm:ss');
  const [duration, setCounter] = useState(moment.duration(value).asMilliseconds());
  useEffect(() => {
    const timer = setInterval(() => {
      console.log('duration 42: ', duration);
      setCounter(duration => moment.utc(duration + 1000).format('HH:mm:ss'));
    }, 1000);
    return () => {
      clearInterval(timer);
    };
  }, []); // Pass in empty array to run effect only once!

  return (
    <View>
      <Text style={styles.texts.mediumText}>{ duration }</Text>
    </View>
  );
}

我认为这行得通,但是当我正确地将初始值打印到屏幕上时,当它递增到下一个值时,打印出来的是:invalid date

我在这里错过了什么?

您不想将持续时间本身设置为格式化输出(因为当您执行 moment.utc(duration + 1000).format('HH:mm:ss') 时,它会尝试执行 moment.utc("12:34:12" + 1000),这会给您一个无效的日期。

相反,只需在输出时格式化字符串即可:

 console.log('duration 42: ', moment.utc(duration).format('HH:mm:ss'));
 <Text style={styles.texts.mediumText}>{ moment.utc(duration).format('HH:mm:ss') }</Text>