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

2023-11-18

由于公司项目需要使用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来获取当前数字来实现转化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • ubuntu编译安装mmcv 1.6.2和mmsegmentation 0.28.0

    环境 ubuntu16 04 cuda10 1 python 3 8 pytorch 1 6 0 cuda10 1 对应的torch版本 lt 1 8 但是1 8和1 7都试了 mmcv没有编译成功 只有1 6成功了 1 编译MMCV 1
  • 行为型模式-策略模式

    package per mjn pattern strategy 抽象策略类 public interface Strategy void show package per mjn pattern strategy 具体策略类 用来封装算法
  • warning: function declared implicitly错误原因

    http blog sina com cn s blog 629f56a70100irbn html line 10 warning function declared implicitly 这是由于没有声明函数原型造成的 在a c中 vo
  • Vue插件

    目录 vue项目目录结构 es6导入导出语法 Vue项目开发规范单页面组件写法 vue项目集成axios vue项目前后端打通 前后端交互之登录功能 props配置项 父组件通过自定义属性与子组件通信 混入 插件 scoped样式 loca
  • c语言socket如何传输图片,socket文件传输功能的实现

    这节我们来完成 socket 文件传输程序 这是一个非常实用的例子 要实现的功能为 client 从 server 下载一个文件并保存到本地 编写这个程序需要注意两个问题 1 文件大小不确定 有可能比缓冲区大很多 调用一次 write se
  • 如何理解面向过程和面向对象?

    一句话理解面向对象 有人说 如果上帝是程序员 他怎么创造世界上的所有动物 理解这个问题就理解了面向对像 面向过程和面向对象区别 面向过程的思路 什么事都自己做 分析解决问题所需的步骤 用函数把这些步骤依次实现 面向对象的思路 什么事都指挥对
  • 可连接点对象及示例(二)

    转载请标明是引用于 http blog csdn net chenyujing1234 例子代码 包括客户端与服务端 http www rayfile com zh cn files de82908f 7309 11e1 9db1 0015
  • 域名怎么解析到服务器上

    今天无事说一说如何把自己的域名解析绑定到自己的服务器上 让访客们可以通过你的域名来访问你的网站 域名解析定义 域名解析是把域名指向网站空间IP 让人们通过注册的域名可以方便地访问到网站的一种服务 IP地址是网络上标识站点的数字地址 为了方便
  • pytorch 中 多头注意力机制 MultiHeadAttention的代码实现及应用

    本文将对 Scaled Dot Product Attention Multi head attention Self attention Transformer等概念做一个简要介绍和区分 最后对通用的 Multi head attenti
  • klocwork 2020.3安装使用过程

    klocwork 2020 3 1 安装过程略过 可查看2019的安装过程 2 web分析 存在漏报的问题 可能是规则选择不全 3 desktop分析 4 嵌入式环境插件分析 e mail lu1024lu foxmail com
  • 软件著作权申请注意事项——常见问题[详细版,不断补充中]

    近期在申请几个软著 查询了大量资料 打了很多电话 经过几次 亲身尝试后 总结出了以下要点问题 基本涵盖了目前网上搜不到的一些注意事项 如有问题欢迎在评论中一起讨论 2020年8月上线了新系统 本说明进行了相应调整 请先阅读 0 新系统计算机
  • 开源库jemalloc简介

    jemalloc是通用的malloc 3 实现 它强调避免碎片和可扩展的并发支持 它的源码位于https github com jemalloc jemalloc 最新稳定版本为5 2 1 glibc的内存分配算法是基于dlmalloc实现
  • Two Arithmetic Progressions

    Two Arithmetic Progressions 题目链接 题意 思路 AC代码1 include
  • .NET Core + K8S 玩转容器编排

    Production Grade Container Orchestration Automated container deployment scaling and management 生产级别的容器编排系统 自动化的容器部署 扩展和管
  • RTMP协议与RTSP协议比较

    考虑做一个手机直播系统 首先需要指定一个合理的技术方案 由于自己以前不是搞多媒体这块 对流媒体开发不熟悉 自己的理解思维总习惯用java web开发的惯性走 先指定一个大体的框架 不管对还是错 先考虑其技术可行性 框架的指定 首先取决于自己
  • 代码走查——项目走向成功的锦囊之一

    说起代码走查 相信每个人都不陌生 但为什么要执行代码走查 什么时候来执行代码走查 如何有效执行代码走查 很多人的看法和见解都不一样 一般的看法 认为代码走查是一种非正式的代码评审技术 它通常在编码完成之后由代码的作者向一组同事来讲解他自己编
  • mysql5.7防火墙_mysql 5.7.13 winx64安装配置方法图文教程(win10)

    本文实例为大家分享了mysql 5 7 13 winx64安装配置方法图文教程 供大家参考 具体内容如下 下载 安装 1 解压下载好的mysql 5 7 13 winx64 zip到你需要安转的目录 eg D mysql 2 配置解压目录下
  • openwrt用git https错误:fatal unable to find remote helper for ‘https‘

    opkg update opkg remove git opkg install git http opkg install ca bundle
  • java连接多个mysql_java – MySql连接太多了

    使用您的方法 如果在调用conn close 之前抛出任何异常 则永远不会关闭连接 您需要在try块中获取它 以及语句和结果集 并在finally块中将其关闭 无论是否抛出异常 都将始终执行finally中的任何代码 有了这个 您可以确保关
  • 使用React实现时间的天数,小时数,分钟数之间的自动转化

    由于公司项目需要使用React实现时间的天数 小时数 分钟数之间的自动转化 在遇了很多坑后终于解决了问题 需要实现的功能 当用户在输入小时数的时候 超过24小时就自动转化为相应的天数 当用户在输入分钟数的时候 超过60分钟以上就要自动转化成