js读取excel时时间会转为一串数字,但是在获取具体时间时为什么有的年份会多加一天?

转换成的一串数字代表的是距离1900-1-1的天数

网上最普遍的方法:

function formatDate(numb, format) {
        const time = new Date((numb - 1) * 24 * 3600000 + 1);
        time.setYear(time.getFullYear() - 70)
        const year = time.getFullYear() ;
        const month = time.getMonth() + 1 ;
        const date = time.getDate() - 1 ;
        return year + format + (month < 10 ? '0' + month : month) + format + (date < 10 ? '0' + date : date)
    }

但是亲测这个方法有误差,算出来的时间有可能会平年少一天( time.getDate() - 1 ),比如我excel里面输入的是2022/03/08,转换数字为44628.转换出来确是2022/03/07,time.getDate()会闰年多一天,2024/6/1会变成2024/6/2。

正确的算法应该是:

方法1:

function formatDate(numb, format) {
                const old = numb - 1;
                const t = Math.round((old - Math.floor(old)) * 24 * 60 * 60);
                const time = new Date(1900, 0, old, 0, 0, t);
                const year = time.getFullYear();
                const month = time.getMonth() + 1;
                const date = time.getDate();
                return year + format + (month < 10 ? "0" + month : month) + format + (date < 10 ? "0" + date : date);
            }

   方法2:      

//timeValue是指excel中的时间整数值

            function formatDate(timeValue) {

                let time = new Date((timeValue - 1) * 24 * 3600000 + 1);

                time.setYear(time.getFullYear() - 70);

                let year = time.getFullYear() + "";

                let month = time.getMonth() + 1 + "";

                let date = time.getDate() + "";

                if (leapyear(year)) {

                    //如果是闰年

                    date = time.getDate() - 1 + "";

                }

                return year + "-" + (month < 10 ? "0" + month : month) + "-" + (date < 10 ? "0" + date : date);

            }

            //区分闰年与平年

            function leapyear(year) {

                var flag = false;

                if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {

                    flag = true;

                }

                return flag;

            }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值