使用React实现时间的天数,小时数,分钟数之间的自动转化

这篇博客详细记录了在React项目中如何实现输入小时和分钟时自动转化成天数,并处理输入叠加的问题。通过定义转化函数transformDate,实现了分钟和小时的相互转化,并在Ant Design的InputNumber组件中利用onChange和onBlur事件处理用户输入,确保数据正确更新。在遇到onChange即时反馈不准确的问题后,改用onBlur事件解决了数字叠加的错误。
摘要由CSDN通过智能技术生成

由于公司项目需要使用React实现时间的天数,小时数,分钟数之间的自动转化,在遇了很多坑后终于解决了问题。

需要实现的功能:当用户在输入小时数的时候,超过24小时就自动转化为相应的天数;当用户在输入分钟数的时候,超过60分钟以上就要自动转化成相应的小时数和天数;且要实现再次输入的叠加(当已经是1天12时,输入61分钟;得到的是1天13时1分钟。以此类推)。

  1. 先实现天数、小时数、分钟数的转化函数

    // 日期转化函数
    // 需要实现功能:当在输入了大于等于24小时就转化成相应的天数,当输入了大于等于60分钟就转化成相应的天数和小时数
    // 数值范围:天 时 分 都在0~9999 暂时先不考虑天数超越极限的情况
    
    // 先进行分转化,再统一进行小时转化
    // 传入的参数分别为 时 分
    export default function transformDate(day,hour,min) {
        // 用于存放新生成的天 时 分
        let newDay = 0;
        let newMin = 0;
        let newHour = 0;
        let arr = []
        // 如果小时大于等于60就转化为小时
        if(min >= 60) {
            newMin = min % 60
            newHour = parseInt(min / 60)
        } else {
            newMin = min
        }
        // 将得到的小时数加上,进行统一转化
        hour = hour + newHour
        // 如果天数大于等于24就转化为天数
        if(hour >= 24) {
            newDay = parseInt(hour / 24) + day
            newHour = hour % 24
        } else {
            newHour = hour
        }
        
        arr.push(newDay)
        arr.push(newHour)
        arr.push(newMin)
        // 最后以数组的形式返回
        return arr
    }
    
  2. 将函数导入到需要使用的文件中

    使用的是React的ant design中的inputNumber的onChange监听数字的变化回调,onChange获取到当前输入框内的数字后再放入失去焦点onBlur()中进行函数转化,再更新数据到页面上。

以下是部分实现代码:

这一部分是实现监听输入框内的数字回调

const [payDateDay, setPayDateDay] = useState(0);
  const [payDateHour, setPayDateHour] = useState(0);
  const [payDateMin, setPayDateMin] = useState(0);
  const [shipDateDay, setShipDateDay] = useState(0);
  const [shipDateHour, setShipDateHour] = useState(0);
  const [shipDateMin, setShipDateMin] = useState(0);
  
  const transformPayDay= (payDateDay:number) => {
    setPayDateDay(payDateDay)
  }

  const transformPayHour= (payDateHour:number) => {
    setPayDateHour(payDateHour)
  }

  const transformPayMin= (payDateMin:number) => {
    setPayDateMin(payDateMin)
  }

  const transformShipDay= (shipDateDay:number) => {
    setShipDateDay(shipDateDay)
  }

  const transformShipHour= (shipDateHour:number) => {
    setShipDateHour(shipDateHour)
  }

  const transformShipMin= (shipDateMin:number) => {
    setShipDateMin(shipDateMin)
  }

这一部分是实现时间转化

{
            field: (ctx:any) => {
                return ( 
                  <AntdForm.Item
                  name="month"
                  label='未支付订单'
                  rules={[{ required: true, message: '未支付订单不能为空' }]}
                  extra={'#到达设置时间后订单由系统自动关闭,设置都为0默认不关闭'}
                  >
                    <InputNumber
                    min={0}
                    max={9999}
                    defaultValue={0}
                    value={payDateDay}
                    style={{ width: '25%' }}
                    onChange={transformPayDay}
                    />
                    <span>&nbsp;&nbsp;</span>
                    <InputNumber
                    min={0}
                    max={9999}
                    defaultValue={0}
                    value={payDateHour}
                    style={{ width: '25%' }}
                    onChange={transformPayHour}
                    onBlur={() => {
                      if(payDateHour >= 24) {
                        setPayDateDay(TransformDate(payDateDay,payDateHour,payDateMin)[0])
                        setPayDateHour(TransformDate(payDateDay,payDateHour,payDateMin)[1])
                        setPayDateMin(TransformDate(payDateDay,payDateHour,payDateMin)[2])
                        if((payDateDay + (payDateHour / 24)) > 9999) {
                          alert('天数的取值范围为0~9999!')
                        }
                      }
                    }}
                    />
                    <span>&nbsp;&nbsp;</span>
                    <InputNumber
                    min={0}
                    max={9999}
                    defaultValue={0}
                    value={payDateMin}
                    style={{ width: '25%' }}
                    onChange={transformPayMin}
                    onBlur={() => {
                      if(payDateMin >= 1440) {
                        setPayDateDay(TransformDate(payDateDay,payDateHour,payDateMin)[0])
                        setPayDateHour(TransformDate(payDateDay,payDateHour,payDateMin)[1])
                      } else if(payDateMin >= 60) {
                        setPayDateHour(TransformDate(payDateDay,payDateHour,payDateMin)[1])
                      }
                      if((payDateDay + (payDateHour / 24) + (payDateMin / 1440)) > 9999) {
                        alert('天数的取值范围为0~9999!')
                      }
                        setPayDateMin(TransformDate(payDateDay,payDateHour,payDateMin)[2])
                    }}
                    />
                    <span>&nbsp;后自动关闭订单</span>
                  </AntdForm.Item>
                );
            }
        },

为什么说遇到了很多坑呢,一开始想的是使用onChange变化回调监听数字变化就能实现功能,可是在使用过程中我发现,在输入的过程中当前输入框内的数字不会发生变化。因为是在鼠标离开输入框的一瞬间,输入框内的数字还是当前数字,所以onChange又进行了一次回调,导致数据进行了叠加。就比如说我输入0天0时120分钟,当输入的是120分钟时会立马出现2时,当光标离开输入框后会出现叠加,变成了0天4时0分。所以这样是不可行的,就想到使用离开光标的方法,这还是要使用到onChange来获取当前数字来实现转化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值