本文详解JavaScript中Date对象的多种构造函数用法,重点解析月份参数范围(0-11)导致的溢出问题。通过示例展示当传入12时自动进位至下一年的现象,并提供手动调整月份参数的解决方案及字符串日期转换技巧。
Date对象概述
Date对象是JavaScript中处理时间的核心工具。在Web开发中,时间特效和日期处理应用广泛,重温Date对象有助于深入理解时间数据的操作方式。
Date构造函数详解
Date对象的实例化主要有三种构造函数形式: var dateObj = new Date(); var dateObj = new Date(dateVal); var dateObj = new Date(year, month, date[, hours[, minutes[, seconds[,ms]]]]);
上述构造函数中,dateVal为必选参数。若为数字,它代表指定日期与1970年1月1日00:00:00(UTC)之间的毫秒数;若为字符串,则按parse方法的规则解析。此外,dateVal也可接受从某些ActiveX对象返回的VT_DATE值。在年月日构造函数中,year为完整年份(如1976,而非76),month为0至11的整数(代表1月至12月),date为1至31的整数,这些均为必选参数。可选参数包括hours、minutes、seconds和ms(毫秒,0至999)。Date对象内部以毫秒存储时间。若某参数超出范围或为负数,其他值会自动调整。例如,指定150秒会被自动转换为2分30秒。
若传入NaN,该对象不表示特定时间段。若未传递参数,Date对象初始化为当前UTC时间。在使用前必须确保已正确赋值。
Date对象能表示的日期范围约为1970年1月1日前后各285,616年。
Date对象提供两个无需创建实例即可调用的静态方法:parse和UTC。
Date对象包含众多实用方法,此处不再逐一列举,后续章节将继续探讨。
月份参数陷阱与解决方案
在实际使用中需特别注意月份参数的取值范围。
**************************************************************
示例代码: var myDate = new Date(2006, 11, 23); alert("year=" + myDate.getYear() + "******month=" + myDate.getMonth() + "********day=" + myDate.getDate());
运行上述代码,输出结果为:year=2006 ******month=11********day=23。此时显示正常,因为月份参数11对应12月,在合法范围内。
**************************************************************
然而,当new Date()传入的月份参数为12时,会出现异常现象。
**************************************************************
示例代码: var myDate = new Date(2006, 12, 23); alert("year=" + myDate.getYear() + "******month=" + myDate.getMonth() + "********day=" + myDate.getDate());
运行结果变为:year=2007 ******month=0********day=23。
**************************************************************
这一现象令人困惑。经查证,Date构造函数中month参数的合法范围是0至11,传入12会导致月份溢出,进而使年份自动加1,月份重置为0(即1月)。解决方法是在传入参数时将month值减1,获取时再加1。是否有更优方案尚待探讨。
具体实现方式如下:
var date = new Date(2010, 0 - 1, 15); // 这里0代表一月份,减1就变成12月份了 alert(date.getYear() + "," + (date.getMonth() + 1) + "," + date.getDate());
var date = new Date(2010, 12 - 1, 15); alert(date.getYear() + "," + (date.getMonth() + 1) + "," + date.getDate());
字符串日期解析
当参数为字符串格式时,如“2010/1/6”,处理方式有所不同。
示例: var txtDepartureDate = '2010-1-6'; alert(txtDepartureDate.replace(/-/g, '/')); // 使用正则将'-'全部替换成/ var date = new Date(txtDepartureDate.replace(/-/g, '/'));