术语
- 时间单位 
- 年(year)
 - 月(month)
 - 日(date)
 - 小时(hour)
 - 分钟(minute)
 - 秒(second) = 1000ms
 - 毫秒(millisecond,ms) = 1000 us
 - 微秒(microsecond,us) = 1000 ns
 - 纳秒(nanosecond,ns)
 
 - UTC和GMT 
- 世界划分为24个时区,北京在东8区,格林威治在0时区。
 - GMT:Greenwish Mean Time 格林威治世界时。太阳时,精确到毫秒。
 - UTC:Universal Time Coodinated 世界协调时。以原子时间为计时标准,精确到纳秒。
 - UTC和GMT之间误差不超过0.9秒
 - GMT+0800 东8区
 
 - 时间戳 
- 数字
 - 1970-1-1 凌晨 到 某个时刻 所经过的毫秒数
 
 
Date Object
创建时间对象
直接调用函数,忽略所有参数,直接返回当前时间的字符串。
Date(); // => 'Mon Oct 25 2021 13:49:33 GMT+0800 (中国标准时间)'
使用 new 关键字来调用 Date 构造函数,将返回一个日期对象。
new Date():创建日期对象
- 无参,表示当前时间;
 - 1个参数,参数为数字,表示传入的是时间戳;
 - 两个参数以上,分别表示:年、月、日、时、分、秒、毫秒 
- 注意:月份的数字从0开始计算。
 - 如果缺失参数,日期部分默认为 1,时分秒毫秒默认为 0。
 - 月、日、时、分、秒、毫秒,均可以传递负数,如果传递负数,会根据指定日期进行计算。
 
 
实例成员
- getDate方法:得到日期部分
 - getDay方法:得到星期几,0表示星期天
 - getFullYear方法:得到年份
 - getHours方法:得到小时部分
 - getMinutes方法:得到分钟部分
 - getSeconds方法:得到秒部分
 - getMilliseconds方法:得到毫秒部分
 - getTime方法:得到时间戳
 - getMonth方法:得到月,从0开始计算
 - setDate方法:设置日期
 - setMonth方法:设置月份
 - setFullYear方法:设置年
 - setMinutes方法
 - setSeconds方法
 - setMilliseconds方法
 - setTime方法:重新设置时间戳
 - toDateString方法:将日期部分转换为可读的字符串。
 - toISOString方法:将整个对象转换为ISO标准的字符串格式。
 - toLocaleDateString方法:根据当前系统的地区设置,将日期部分转换为可读的字符串
 - toLocaleString方法:根据当前系统的地区设置,将整个日期对象转换为可读的字符串
 - toLocaleTimeString方法:根据当前系统的地区设置,将时间部分转换为可读的字符串
 
日期的运算
日期对象重写了 Object 中的 valueOf 方法,返回的是一个数字,表示时间戳。因此,日期对象可以进行数学运算。可以进行数学运算,意味着:我们可以比较两个日期对象的大小(因为会自动调用 valueOf 方法,得到它们的时间戳,再进行比较),可以直接计算天数:日期对象 ÷ 24 * 60 * 60 * 1000(每小时 60 分,每分 60秒,每秒 1000毫秒)。
codes
- 1.js
 
Date(); // => Mon Oct 25 2021 13:53:14 GMT+0800 (中国标准时间)new Date(); // => Mon Oct 25 2021 13:54:27 GMT+0800 (中国标准时间)new Date(1000); // => Thu Jan 01 1970 08:00:01 GMT+0800 (中国标准时间)new Date(-1000); // => Thu Jan 01 1970 07:59:59 GMT+0800 (中国标准时间)new Date(2015, 5, 1, 13, 14, 15, 200); // Mon Jun 01 2015 13:14:15 GMT+0800 (中国标准时间)new Date(2015, 5); // Mon Jun 01 2015 00:00:00 GMT+0800 (中国标准时间)new Date(2015, 0, 1); // Thu Jan 01 2015 00:00:00 GMT+0800 (中国标准时间)new Date(2015, 0, 0); // 提前 1 天 => Wed Dec 31 2014 00:00:00 GMT+0800 (中国标准时间)new Date(2015, 0, -1); // 提前 2 天 => Tue Dec 30 2014 00:00:00 GMT+0800 (中国标准时间)/* 注意:这里传入的时间是北京时间,因为将格林威治时间转换成了北京时间 所以在初始时间的基础上 加了 8 小时。月份的数字从 0 开始计算,日期是从1开始的。如果缺失参数,日期部分默认为 1,时分秒毫秒默认为 0。月、日、时、分、秒、毫秒,均可以传递负数,如果传递负数,会根据指定日期进行计算。*/
- 2.js
 
var d = new Date();// getd.getDate(); // => 15d.getDay(); // => 2 => 周三d.getFullYear(); // => 2020d.getHours(); // => 19 => 晚上7点d.getMinutes(); // => 48 => 48分d.getSeconds(); // => 10 => 10秒d.getMilliseconds(); // => 588 => 588毫秒d.getTime(); // => 1600170490588d.getMonth(); // => 8 => 9月
- 3.js
 
var d = new Date();d; // => Tue Sep 15 2020 19:51:31 GMT+0800 (中国标准时间)d.setDate(14); // 1600084394946 设置日期,返回的是一个时间戳。d; // Mon Sep 14 2020 19:53:14 GMT+0800 (中国标准时间)/*setMonthsetFullYearsetMinutessetSecondssetMillisecondssetTime*/
- 4.js
 
// 转换为字符串var d = new Date();d.toDateString(); // => 将日期部分转换为可读的字符串 => Tue Sep 15 2020d.toISOString(); // => 将整个对象转换为 ISO 标准的字符串格式 => 2020-09-15T11:57:53.979Zd.toLocaleDateString(); // => 根据当前系统的地区设置,将日期部分转换为可读的字符串 => 2020/9/15d.toLocaleString(); // => 根据当前系统的地区设置,将整个日期对象转换为可读的字符串 => 2020/9/15 下午7:57:53d.toLocaleTimeString(); // => 根据当前系统的地区设置,将时间部分转换为可读的字符串 => 下午7:57:53
- 5.js
 
/*日期的运算日期对象重写了 Object 中的 valueOf 方法,返回的是一个数字,表示时间戳。因此,日期对象可以进行数学运算。示例:加 1 天*/// 正确写法var d = new Date();d; // => Tue Sep 15 2020 20:11:38 GMT+0800 (中国标准时间)d.setTime(d.valueOf() + 24 * 60 * 60 * 1000); //d; // => Wed Sep 16 2020 20:11:38 GMT+0800 (中国标准时间)// 错误写法var d = new Date();d; // => Tue Sep 15 2020 20:11:38 GMT+0800 (中国标准时间)d.setTime(d.getDate() + 1); // d.getDate() + 1 ==> 16d; // => Thu Jan 01 1970 08:00:00 GMT+0800 (中国标准时间)
练习
- 编写一个函数,用于返回一个友好的日期字符串格式
年-月-日 时:分:秒 - 给定用户的生日(年、月、日),计算该用户的年龄 
- 扩展:计算还有多少天过生日
 
 - 根据系统当前的月份,输出这一个月每一天的星期
2019年6月1日:星期六
2019年6月2日:星期日
…..
2019年6月30日:星期日
提示:如何获取某个月的天数?
示例:获取 2021 年 2 月份的天数:new Date(2021, 2, 0).getDate(); // => 28
日期是从 1 开始算的,若传入的日期部分是 0,那么表示上个月的最后一天。 
