Date 对象用于处理日期和时间。与前面介绍的对象不同的是, DOM 里并没有现成的 Date 对象,而是要我们在需要时创建自己的 Date 对象。每个 Date 对象都表示不同的日期和时间。
ECMAScript 的 Date 类型参考了 Java 早期版本中的 java.util.Date 。为此, Date 类型将日期 保存为自协调世界时( UTC , Universal Time Coordinated )时间 1970 年 1 月 1 日午夜(零时)至今所 经过的毫秒数。使用这种存储格式, Date 类型可以精确表示 1970 年 1 月 1 日之前及之后 285 616 年的 日期。
const dateObj =new Date();
const ateObj=new Date(dateVal)
const dateObj=new Date(year,month,date[,hours[,minutes[,seconds[,ms]]]]);
参数 | 说明 |
---|---|
dateObj | 必选项。要赋值为 Date 对象的变量名 |
dateVal | 必选项。如果是数字, dateVal 表示指定日期与 1970 年 1 月 1 日午夜间全球标准时间的毫秒数。如果是字符串,则 dateVal 按照 parse 方法中的规则进行解析。 dateVal |
参数也可以是从 ActiveX ( X )对象返回的 VT_DATE 值 | |
year | 必选项。完整的年份(四位) |
mouth | 必选项。表示月份,是 0 ~ 11 的整数 |
date | 必选项。表示日期,是 1 ~ 31 之间的整数 |
hours | 可选项。如果提供了 minutes ,则必须给出。表示是从 0 ~ 23 的整数 |
minutes | 可选项。如果提供了 seconds ,则必须给出。表示是 0 ~ 59 的整数 |
seconds | 可选项。如果提供了 ms ,则必须给出。表示是 0 ~ 59 的整数 |
ms | 可选项。表示毫秒,是 0 ~ 999 的整数 |
var year = myDate.getFullYear(); // 四位数字表示的年份,比如 1993
// 数字表示的月份, 0 ~ 11 , 0 表示 1 月,以此类推
var month = myDate.getMonth();
// 日期, 1 ~ 31
var date = myDate.getDate();
// 星期, 0 ~ 6 , 0 表示星期日,以此类推
var day = myDate.getDay();
// 时, 0 ~ 23
var hours = myDate.getHours();
// 分, 0 ~ 59
var minutes = myDate.getMinutes();
// 秒, 0 ~ 5
var seconds = myDate.getSeconds();
给 Date() 语句传递相应的参数,我们就可以创建任意指定日期和时间的 Date 对象 。
new Date(milliseconds); // 自 1970 年 1 月 1 日起的毫秒数
new Date(dateString);
new Date(year, month, day, hours, minutes, seconds, milliseconds);
在使用单独的各部分参数时,位置靠后的参数是可选的,任何未明确指定的参数值将用 0 替代。
在不给 Date 构造函数传参数的情况下,创建的对象将保存当前日期和时间。要基于其它日期和时 间创建日期对象,必须传入其毫秒表示( UNIX 纪元 1970 年 1 月 1 日午夜之后的毫秒数)。 ECMAScript 为此提供了两个辅助方法: Date.parse() 和 Date.UTC()
Date.parse() 方法接收一个表示日期的字符串参数,尝试将这个字符串转换为表示该日期的毫秒 数。
如果传给 Date.parse() 的字符串并不表示日期,则该方法会返回 NaN 。如果直接把表示日期的字 符串传给 Date 构造函数,那么 Date 会在后台调用 Date.parse() 。换句话说,下面这行代码跟前面 那行代码是等价的:
let someDate = new Date('May 23, 2019');
Date.UTC() 方法也返回日期的毫秒表示,但使用的是跟 Date.parse() 不同的信息来生成这个值。 传给 Date.UTC() 的参数是年、零起点月数( 1 月是 0 , 2 月是 1 ,以此类推)、日( 1~31 )、时( 0~23 )、 分、秒和毫秒。这些参数中,只有前两个(年和月)是必需的。如果不提供日,那么默认为 1 日。其它 参数的默认值都是 0 。
// GMT 时间 2021 年 1 月 1 日零点
let y = new Date(Date.UTC(2021, 0));
// GMT 时间 2021 年 4 月 17 日下午 6 点 23 分 55 秒
let a = new Date(Date.UTC(2021, 3, 17, 6, 23, 55));
判断当前对象是否为日期对象。
用自定义属性来记录当前日期是本周的周几。
使用不带参数的构造方法就可以直接返回一个 Date 实例,该实例代表当前计算机系统设定的时间和日期值。例如下面的代码:
var nowDate = new Date();
console.log(nowDate.toString());
将返回下面的数据(依据用户计算机时钟的设置):
Tue Nov 13 22:41:58 UTC+0800 2007
也可以使用静态方法 Date.now() 返回当前事件的时间戳,这是一个数字。例如下面的代码:
var nowDate = Date.now();
console.log(nowDate); // 1737682603322
使用带参数的构造方法也可以返回一个 Date 实例,该实例包含有特定的时间和日期,例如下面的代码,为 Tim 的生日( 1940 年 2 月 10 日)创建一个新的 Date 实例:
var tim_birthday = new Date(40, 2, 10);
console.log(tim_birthday.toString());
这将返回:
Sun Mar 10 1940 00:00:00 GMT+0800 (中国标准时间)
使用 Date.getXXX() 方法可以获取 Date 实例中所表示的数据值,例如,使用下面的语法可以获取当前的完整时间和日期:
var nowDate = new Date();
console.log(
nowDate.getFullYear().toString() +
'-' +
(nowDate.getMonth() + 1).toString() +
'-' +
nowDate.getDate().toString() +
'',
);
console.log(
nowDate.getHours().toString() +
':' +
nowDate.getMinutes().toString() +
':' +
nowDate.getSeconds().toString() +
':' +
nowDate.getMilliseconds(),
);
在创建完 Date 实例后,使用 Date.setXXX() 方法可以设置其中某个字段的数据,例如,使用下面的语法可以设置 Date 实例的小时数:
var nowDate = new Date();
nowDate.setHours(5);
这样就改变日期中的小时字段到 5 点。这时,无论用户操作系统上当前的时间为何, nowDate 对象所包含的小时字段都是 5 。
下面列出了 setXXX() 方法及其参数,参数的含义与前面介绍的构造方法相同:
Date.setTime(time)
Date.setMilliseconds(millisecond)
Date.setUTCMilliseconds(millisecond)
Date.setSeconds(second [, millisecond ] )
Date.setUTCSeconds (second [, millisecond ] )
Date.setMinutes (minute [, second [, millisecond ] ] )
Date.setUTCMinutes(minute [, second [, millisecond ] ] )
Date.setHours (hour [, minute [, second [,millisecond ] ] ] )
Date.setUTCHours (hour [, minute [, second [, millisecond ] ] ] )
Date.setDate(date)Date.setUTCDate (date)Date.setMonth (month [, date ])
Date.setUTCMonth (month [, date ] )
Date.setFullYear (year [, month [, date ] ] )Date.setUTCFullYear (year [,month [, date ] ] )
使用 parse() 方法可以解析一个包含日期的字符串,并返回该日期与 1970 年 1 月 1 日午夜之间所间隔的毫秒数。
其语法格式如下:
Date.parse(value);
参数 value 是一个包含以诸如 Jan 5, 1996 08:47:00 格式表示的日期字符串。
parse() 方法是 Date 类的一个静态方法,所以无需创建实例就可以调用,例如下面的代码:
var dateString = 'November 1, 1997 10:15 AM';
var time = Date.parse(dateString);
下面这些规则决定了 parse() 方法能够成功解析的字符串。
短日期可以使用 " / "或 " - "作为日期分隔符,但是必须用 "月 / 日 / 年 "或 "月 - 日 - 年 "的格式来表示,例如 12/25/98 。
以 July 10 1995 形式表示的长日期中的年、月、日可以按任何顺序排列,年份值可以用 2 位数字表示,也可以用 4 位数字表示。如果使用 2 位数字来表示年份,那么该年份必须大于或等于 70 。
括号中的任何文本都被视为注释,这些括号可以嵌套使用。
逗号和空格被视为分隔符,允许使用多个分隔符。
月和日的名称必须具有两个或两个以上的字符。如果两个字符所组成的名称不是独一无二的,那么该名称就被解析成最后一个符合条件的月或日。例如, Ju 被解释为 7 月( July )而不是 6 月( June )。
在所提供的日期中,如果所指定的星期几的值与按照该日期中剩余部分所确定的星期几的值不符合,那么该指定值就会被忽略。例如,尽管 1996 年 11 月 9 日实际上是星期五, Tuesday November 9 1996 也还是可以被接受并进行解析的,但是结果 Date 对象中包含的是 Friday November 9 1996 。
JavaScript 处理所有的标准时区以及通用时间( UTC )和格林尼治标准时间( GMT )。
小时、分钟和秒之间用冒号分隔,尽管不是这 3 项都需要指明。如 10: 、 10:11 和 10:11:12 都是有效的。
如果使用 24 小时计时的时钟,那么为中午 12 点之后的时间指定 PM 是错误的。例如 21:15PM 就是错误的。
包含无效日期的字符串是错误的。例如,一个包含有两个年份或两个月份的字符串就是错误的。
使用 Date.UTC() 方法可以返回通用时间( UTC )从 1970 年 1 月 1 日子时到所指定日期之间所间隔的毫秒数。该返回值可以用在 setTime() 方法中和 Date 类的构造方法中。
使用该方法也可以构造一个时间,由于该方法是静态方法,所以无需创建实例就可以调用,其语法格式如下:
Date.UTC(year, month[, day[, hours[, minutes[, seconds[, millisecond]]]]])
参数项与 Date 类的构造方法参数功能完全相同。
如果一个参数的值超出其范围或者是一个负数,那么其它保存过的值将相应地得到改变。例如,如果使用者指定 150 秒, JavaScript 会将该数值重新定义为 2 分钟 30 秒。
如果参数 year 处于 0~99 之间,年份为 1900+year 。
Date.UTC() 方法和 Date 类的使用日期值作为参数的构造方法之间的差别在于: Date.UTC() 方法假设是 UTC 时间,而 Date 类的构造方法假定是本地时间。
例如下面的代码可以帮助用户区分二者:
// MonAug 7 00:00:00 UTC+0800 1989
var aDate = new Date(89, 7, 7);
console.log(aDate);
var time = Date.UTC(89, 7, 7);
var bDate = new Date(time);
console.log(bDate); // Mon Aug 7 08:00:00 UTC+0800 1989
因为我们在东八区,所以,结果显示时间相差 8 个小时。
方法 | e |
---|---|
Date() | 返回系统的当前日期和时间 |
getDate() | 从 Date 对象返回一个月中的某一天( 1~31 ) |
getDay() | 从 Date 对象返回一周中的某一天( 0~6 ) |
getMonth() | 从 Date 对象返回月份( 0~11 ) |
getFullYear() | 从 Data 对象以四位数字返回年份 |
getHours | 赶回 Data 对象的时( 0~23 ) |
getMinutes() | 返回 Data 对象的分( 0~59 ) |
getSeconds | 返回 Data 的秒( 0~59 ) |
getMilliseconds() | 返回 Data 对象的毫秒( 0~999 |
getTime() | 返回 1970 年 1 月 1 日至今的毫秒数 |
getTimezoneOffset() | 返回本地时间与格林尼标准时间的分钟差( GMT ) |
getUTCDate | 根据世界时从 Data 对象返回月中的一天( 1~31 ) |
getUTCDay() | 根据世界时从 Data 对象返回周中的一天( 0~6 ) |
getUTCMonth() | 根据世界时从 Data 对象返回月份( 0~11 ) |
getUTCFullYear() | 根据世界时从 Date 对象返回四位数字的年份 |
getUTCHours() | 根据世界时返回 Data 对象的时( 0~23 ) |
getUTCMinutes() | 根据世界时返回 Data 对象的分( 0~59 ) |
getUTCSeconds() | 根据世界时返回 Data 对象的秒( 0~59 ) |
getUTCMilliseconds() | 根据世界时返回 Data 对象的毫秒( 0~999 ) |
parse() | 返回 1970 年 1 月 1 日午夜到指定日期( 字符串) 的毫秒数 |
setDate() | 设置 Date 对象月中的某一天( 1~31 ) |
setMonth() | 设置 Date 对象月份( 0~11 ) |
setFullYear() | 设置 Data 对象以四位数字年份 |
setYear() | 设置 Data 对象的年份( 两位或四位) |
setHours() | 设置 Data 对象的时( 0~23 ) |
setMinutes() | 设置 Data 对象的分( 0~59 ) |
setSeconds | 设置 Data 的秒( 0~59 ) |
setMilliseconds() | 设置 Data 对象的毫秒( 0~999 ) |
setTime() | 通过从 1970 年 1 月 1 日午夜添加或减少指定数目的毫秒数爱计算日期和时间 |
setUTCDate | 根据世界时从 Data 对象设置月中的一天( 1~31 ) |
setUTCMonth() | 根据世界时从 Data 对象设置月份( 0~11 ) |
setUTCFullYear() | 根据世界时从 Date 对象设置四位数字的年份 |
setUTCHours() | 根据世界时设置 Data 对象的时( 0~23 ) |
setUTCMinutes() | 根据世界时设置 Data 对象的分( 0~59 ) |
setUTCSeconds() | 根据世界时设置 Data 对象的秒( 0~59 ) |
setUTCMilliseconds() | 根据世界时设置 Data 对象的毫秒( 0~999 ) |
toSource() | 代表对象的源代码 |
toString() | 把 Date 对象转化成字符串 |
toTimeString() | 把 Data 对象的时间部分转化成字符串 |
toDateString() | 把 Data 对象的日期部分转化成字符串 |
toGMTString() | 根据格林尼时间, 把 Data 对象转换成字符串 |
toUTCString() | 根据世界时, 把 Data 对象转化成字符串 |
toLocalString() | 根据本地时间, 把 Data 对象转化成字符串 |
toLocalTimeString | 根据本地时间, 把 Data 对象的时间部分转化成字符串 |
toLocalDateString | 根据本地时间, 把 Data 对象的日期部分转化成字符串 |
UTC() | 根据世界时, 获得日期, 然后返回 1970 年 1 月 1 日午夜到该日期的毫秒数 |
valueOf() | 返回 Data 的原始值 |
当需要进行各种常见的运算时,用 Math 对象能够简化很多工作。
与 Date 对象不同的是, Math 对象不需要创建就可以使用。它是已经存在的,可供用户直接调用它的方法。
任何对象都可以使用关键字 with ,但 Math 对象是最适合用来示范的。通过使用 with ,我们可以减少一些枯燥的键盘输入工作。
关键字 with 以对象作为参数,然后是一对花括号,其中包含着代码块。代码块里的语句在调用特定对象的方法时可以不必指定这个对象,因为 JavaScript 会假定这些方法是属于作为参数的那个对象的。