创建

new Date()
不带参数 —— 创建一个表示当前日期和时间的 Date 对象:

  1. let now = new Date();
  2. alert( now ); // 显示当前的日期/时间

new Date(milliseconds)
传入时间戳,来创建日期
new Date(datestring)
只有一个参数,并且是字符串,那么它会被自动解析。该算法与 Date.parse 所使用的算法相同:let date =newDate(“2017-01-26”);
new Date(year, month, date, hours, minutes, seconds, ms)
只有前两个参数是必须的

除了 setTime() 都有 UTC 变体,例如:setUTCHours()。

自动校准(Autocorrection)

自动校准 是 Date 对象的一个非常方便的特性。我们可以设置超范围的数值,它会自动校准。

假设我们要在日期 “28 Feb 2016” 上加 2 天。结果可能是 “2 Mar” 或 “1 Mar”,因为存在闰年。但是我们不需要去考虑这些,只需要直接加 2 天,剩下的 Date 对象会帮我们处理:

  1. let date = new Date(2016, 1, 28);
  2. date.setDate(date.getDate() + 2);
  3. alert( date ); // 1 Mar 2016

这个特性经常被用来获取给定时间段后的日期。例如,我们想获取“现在 70 秒后”的日期:

  1. let date = new Date();
  2. date.setSeconds(date.getSeconds() + 70);
  3. alert( date ); // 显示正确的日期信息
  4. //设置 0 甚至可以设置负值
  5. let date = new Date(2016, 0, 2); // 2016 年 1 月 2 日
  6. date.setDate(1); // 设置为当月的第一天
  7. alert( date );
  8. date.setDate(0); // 天数最小可以设置为 1,所以这里设置的是上一月的最后一天
  9. alert( date ); // 31 Dec 2015

日期转化为数字,日期差值

当 Date 对象被转化为数字时,得到的是对应的时间戳,与使用 date.getTime() 的结果相同:

  1. let date = new Date();
  2. alert(+date); // 以毫秒为单位的数值,与使用 date.getTime() 的结果相同

日期可以相减,相减的结果是以毫秒为单位时间差:

  1. let start = new Date(); // 开始测量时间
  2. // do the job
  3. for (let i = 0; i < 100000; i++) {
  4. let doSomething = i * i * i;
  5. }
  6. let end = new Date(); // 结束测量时间
  7. alert( `The loop took ${end - start} ms` );

Date.now()

它会返回当前的时间戳,相当于 new Date().getTime(),但它不会创建中间的 Date 对象。因此它更快

对一个字符串使用 Date.parse

Date.parse(str) 方法可以从一个字符串中读取日期。
字符串的格式应该为:YYYY-MM-DDTHH:mm:ss.sssZ,其中:

  • YYYY-MM-DD —— 日期:年-月-日。
  • 字符 “T” 是一个分隔符。
  • HH:mm:ss.sss —— 时间:小时,分钟,秒,毫秒。
  • 可选字符 ‘Z’ 为 +-hh:mm 格式的时区。单个字符 Z 代表 UTC+0 时区。

Date.parse(str) 调用会解析给定格式的字符串,并返回时间戳(自 1970-01-01 00:00:00 起所经过的毫秒数)。如果给定字符串的格式不正确,则返回 NaN。

  1. let ms = Date.parse('2012-01-26T13:51:50.417-07:00');
  2. alert(ms); // 1327611110417 (时间戳)