当前位置: 首页 > Web前端 > HTML

处理safari浏览器newDate()的某些日期格式导致的InvalidDate

时间:2023-04-02 13:43:25 HTML

1原因safari浏览器新的Date(dateStr:string)格式要求如下:/***dateStrmusthaved(day);月、日、时、分、秒不需要满足补0规则;但时钟中必须有分钟***/newDate('yyyy/MM/ddHH:mm:ss');newDate('yyyy/MM/ddHH:mm');newDate('yyyy/M/d');newDate('yyyy/M/dd');newDate('yyyy/MM/d');newDate('yyyy/M');//无效日期newDate('yyyy/MM');//无效的Datenew日期('yyyy/MMHH');//无效日期newDate('yyyy/MMHH:mm:ss');//无效日期/***dateStr不必有d(day);但M(月)、d(日)和时、分、秒必须小于10,补0;如果有小时、分钟和秒,则必须与T相连;如果有时钟就必须有分钟***/newDate('yyyy-MM-ddTHH:mm:ss');newDate('yyyy-MM-ddTHH:mm');newDate('yyyy-MM-dd');新日期('yyyy-MM');新日期('yyyy-M');//无效日期newDate('yyyy-M-d');//无效日期newDate('yyyy/MMHH');//无效日期newDate('yyyy-MM-ddH:MM');//InvalidDate2解决方法2.1自定义一个构造函数classMyDateextendsDate{constructor()constructor(value:number|string)constructor(year:number,month:number,date?:number,hours?:number,minutes?:number,秒?:数字,毫秒?:数字r)constructor(...args:any){super(...args);if(this.toString()==='无效日期'&&args.length===1&&typeofargs[0]==='string'){constdateStr=args[0];constdateReg:any={year:'0*(\\d+)',//日期分隔符splitChar:'(?:([\\/\\-]))?',month:'(?:0*([1-9]|(?:1[0-2])))?',日期:'(?:0*([1-9]|(?:[1-2]\\d)|(?:3[0-1])))?',小时:'(?:0*((?:1?\\d)|(?:2[0-3]))?)',分钟:'(?::0*([1-5]?\\d)?:*)',秒:'(?::0*([1-5]?\\d))?',毫秒:'(?::0*(\\d{0,3}))?',//ZeroOClock:'(?:(24)(?::0*:*)(?::0*){0,2})',};//前者匹配24点之前,后者匹配24点整dateReg.time=`(?:(?:${dateReg.hour}${dateReg.minute}${dateReg.second}${dateReg.millisecond})|${dateReg.zeroOClock})`;constregStr=newRegExp(`^${dateReg.year}${dateReg.splitChar}${dateReg.month}(?:\\2${dateReg.date})?(?:[T]+${dateReg.time}:?)?$`);constdateMathArr=dateStr.match(regStr);if(dateMathArr){returnnewDate(...(dateMathArr.slice(1,2)asArray).concat(//d(day):比实际大1的数字代表的月份month(由字符串传入),所以需要减去1(Number(dateMathArr[3])||1)-1,(dateMathArr[4]||1),//H(hour),因为有匹配时间的两种情况,需要兼容第二种情况dateMathArr.pop()||dateMathArr[5]||0,//MM:SS:MSdateMathArr.slice(6,9).map(item=>项目||0),));}}}}//使用constmyDate=newMyDate('2022-1-1');2.2重写日期函数Date=function(Date){MyDate.prototype=Date.prototype;//将Date构造函数的属性方法复制到MyDate构造函数varproperties=Object.getOwnPropertyNames(Date.prototype.constructor);if(propertys&&propertys.length>0){for(vari=0;iitem||0));if(date&&date.toString()!=='无效日期')返回日期;}}返回这个日期;}}(Date);//使用constmyDate=newDate('2022-1-1');2.2.1简化版不对日期字符串中的数字做进一步检查,只支持普通日期字符串;Date=function(Date){MyDate.prototype=Date.prototype;//将Date构造函数的属性方法复制到MyDate构造函数varproperties=Object.getOwnPropertyNames(Date.prototype.constructor);如果(属性&&propertys.length>0){for(vari=0;我<属性.length;i++){变量名=属性[i];MyDate[名称]=Date.prototype.constructor[名称];}}返回我的日期;functionMyDate(){//仅对不支持的日期格式进行处理constthisDate=newDate(...arguments);if(thisDate.toString()==='无效日期'&&arguments.length===1&&typeofarguments[0]==='string'){constdateStr=arguments[0];constdateMathArr=dateStr.match(/^(\d+)(?:([\/\-])(\d+))?(?:\2(\d+))?(?:[T]+(?:(\d+))(?::(\d+))(?::(\d+))?(?::(\d+))?)?$/);如果(dateMathArr){constdate=newDate(...dateMathArr.slice(1,2).concat((dateMathArr[3]||1)-1,dateMathArr.slice(4).map((item,index)=>项目||(索引>0?0:1))));if(date&&date.toString()!=='无效日期')返回日期;}}返回这个日期;}}(Date);3未解决的问题比如日期字符串的第一个数字不是年份,在chrome和safari上解析的日期不同:newDate('10')//chrome:MonOct01200100:格林威治标准时间00:00+0800(ChinaStandardTime)//safari:FriJan01001008:05:43GMT+0805(CST)参考:JavaScriptnewDate()坑重构Safari上的Date构造函数,在newDate()处理safari浏览器报Invalidvalue