在 React Native 中使用 Momentjs 计算预订结束前的剩余时间

Calculate time remaining before a booking ends with Momentjs in React Native

我有一组数据,我正在通过这些数据映射用户选择特定时间段来预订会议室的位置,我正在尝试获取此预订的 end_date 并计算出有多少 hours/minutes 在此预订结束前剩余。

我正在尝试使用 Momentjs 来执行此操作,并且想知道这样做的最佳方法是什么。

我的数据数组包含几个不同的预订,因此我在 UI 的不同卡片中映射并呈现 'Time Left'。

我的数组如下所示:

[
   {
     created_at: "2021-08-19T13:20:26.000000Z"
     end_date: "2021-08-19 17:59:50"
     id: 171
     key_id: "30654908"
   }
]

我的代码目前是这样的:

const ActiveSession = ({navigation}) => {
  const {bookings} = React.useContext(StateContext);

  console.log(bookings);

  let now = moment()
  console.log(now);

return (
    <>
      {bookings.map((booking, index) => (
        <View style={styles.subContainer} key={index}>
          <View style={styles.topbar}>
            <Image
              style={styles.tinyLogo}
              source={{uri: booking.pod.location.image}}
            />
            <View>
              <Text>
                <Text style={{fontWeight: 'bold'}}>{booking.pod.name}</Text>
              </Text>
              <Text>{`Time left - ${moment(booking.end_date).format('H:mm')}</Text>
            </View>
          </View>
       </>
     )
   }

如您所见,我的 end_date 时间格式正确,但不确定如何从中减去当前时间,尤其是超过一个小时时。

预订结束前可能只有几分钟或几个小时等。我知道这可能很容易,但我们将不胜感激!

提前致谢。

我不得不假设一些数据并使用 useState 能够每秒重新渲染屏幕,但这是一个工作示例。让我知道这是否是您要找的。

import React, { useEffect, useState } from 'react';
import { StyleSheet, View, Text, TouchableOpacity } from 'react-native';
import moment from 'moment';

const formatTime = (duration) => {
  var hours = Math.floor(duration / 3600);
  var minutes = Math.floor((duration % 3600) / 60);
  var seconds = duration % 60;

  if (hours < 10) {
    hours = '0' + hours;
  }
  if (minutes < 10) {
    minutes = '0' + minutes;
  }
  if (seconds < 10) {
    seconds = '0' + seconds;
  }
  return hours + ':' + minutes + ':' + seconds;
};

const ActiveSession = ({ navigation }) => {
  // const { bookings } = React.useContext(StateContext);
  const [bookings, setBookings] = useState([
    {
      created_at: '2021-08-19T13:20:26.000000Z',
      end_date: '2021-08-19 17:59:50',
      id: 171,
      key_id: '30654908',
      timeLeft: moment('2021-08-19 17:59:50').diff(moment(), 'seconds'),
    },
    {
      created_at: '2021-08-19T15:20:26.000000Z',
      end_date: '2021-08-19 18:59:50',
      id: 172,
      key_id: '30654908',
      timeLeft: moment('2021-08-19 18:59:50').diff(moment(), 'seconds'),
    },
    {
      created_at: '2021-08-19T16:20:26.000000Z',
      end_date: '2021-08-19 19:59:50',
      id: 173,
      key_id: '30654908',
      timeLeft: moment('2021-08-19 19:59:50').diff(moment(), 'seconds'),
    },
  ]);

  useEffect(() => {
    const timer = setInterval(() => {
      const newBookings = bookings.map((booking) => {
        return {
          ...booking,
          timeLeft: moment(booking.end_date).diff(moment(), 'seconds'),
        };
      });
      setBookings(newBookings);
    }, 1000);
    return () => {
      clearInterval(timer);
    };
  }, [bookings]);

  return (
    <>
      {bookings.map((booking, index) => (
        <View style={styles.subContainer} key={index}>
          <View style={styles.topbar}>
            {/* <Image
              style={styles.tinyLogo}
              source={{ uri: booking.pod.location.image }}
            /> */}
            <View>
              <Text>
                {/* <Text style={{fontWeight: 'bold'}}>{booking.pod.name}</Text> */}
                <Text style={{ fontWeight: 'bold' }}>{booking.id}</Text>
              </Text>
              <Text>{`Time left - ${moment(booking.end_date).format(
                'H:mm'
              )} ${formatTime(booking.timeLeft)}`}</Text>
            </View>
          </View>
        </View>
      ))}
    </>
  );
};

const styles = StyleSheet.create({});

export default ActiveSession;