本文是 重温基础 系列文章的第七篇. 今日感受: 做好自律.
系列目录:
[复习资料] ES6/ES7/ES8/ES9 资料整理(个人整理)
[重温基础] 1. 语法和数据类型
[重温基础] 2. 流程控制和错误处理
[重温基础] 3. 循环和迭代
[重温基础] 4. 函数
[重温基础] 5. 表达式和运算符
[重温基础] 6. 数字
本章节复习的是 JS 中的时间对象, 一些处理的方法.
前置知识:
JavaScript 中的时间是以 1970 年 1 月 1 日 00:00:00 以来的毫秒数来储存数据类型.
Data 对象的范围是相对距离 UTC1970 年 1 月 1 日的前后 100,000,000 天.
创建一个时间对象:
let d = new Date([params]);
参数 params 可以是:
无参数: 默认创建今天的日期和时间.
一个符合以下格式的表示日期的字符串:
"月 日, 年 时: 分: 秒." 或者 "年月日 时分秒"
let d = new Date("2018-12-20");
如果你省略时, 分, 秒, 那么他们的值将被设置为 0.
一个年, 月, 日的整型值的集合:
let d = new Date(2018, 12, 20);
一个年, 月, 日, 时, 分, 秒的集合:
let d = new Date(2018, 12, 20, 23, 20, 10);
这里 Date 对象涉及到的方法特别多, 请移步 W3school JavaScript Date 对象
1.Date 对象的方法
常用处理的方法有以下几类:
"set": 用于设置 Date 对象的日期和时间的值.
"get": 用去获取 Date 对象的日期和时间的值.
"to": 用于返回 Date 对象的字符串格式的值.
"parse 和 UTC": 用于解析 Date 字符串.
需要注意的 Date 对象的一些数值问题:
秒 / 分: 0 - 59;
时: 0 - 23;
星期: 0(周日) - 6(周六)
日期: 1 - 31
月份: 0(一月) - 11(十二月)
年份: 从 1900 开始的年数
例如:
- let d = new Date('2018-12-10');
- let d1 = d.getMonth(); // 11
- let d2 = d.getFullYear(); // 2018
获取今年剩下的天数:
- let d = new Date();
- let e = new Date(2018, 11, 31, 23, 59, 59, 999); // 设置年月日时分秒
- e.setFullYear(d.getFullYear); // 设置为今年
- let m = 24 * 60 * 60 * 1000; // 每日毫秒数
- let result = (e.getTime() - d.getTime()) / m;
- result = Math.round(result); // 返回今年剩余天数
这里 Date 对象涉及到的方法特别多, 请移步 W3school JavaScript Date 对象
注意:
格林尼治标准时间 (GMT) 英国, 爱尔兰, 冰岛和葡萄牙属于该时区. 这个时区与中国北京时间的时差是 8 个小时, 也就是说比北京时间晚 8 个小时.
2. 使用 Date 对象
2.1 设置日期
为一个时间对象设置指定日期(2018 年 12 月 20 日), 注意这里: 和前面说的一样, 12 月在 JS 的 Date 对象中, 是用 11 表示.
- let d = new Date();
- d.setFullYear(2018,11,20);
设置时间对象 10 天以后:
- let d = new Date();
- d.setDate(d.getDate() + 10); // 先获取当天的日期, 再设置到指定天数以后
2.2 比较时间
通常情况下, 像下面这样简单比较:
- let d = new Date();
- let e = new Date();
- d.setFullYear(2018,10,10);
- let r = d> e ? 'good' : 'nice' ; // nice
还可以比较两个日期相差多少天:
- let d1 = new Date('2018-10-10');
- let d2 = new Date('2018-11-11');
- let d3 = (d2 - d1) / (1000 * 60 * 60 * 24); // 32
2.3 计算 N 天后星期几
- function d (num){
- if(typeof Number(num) === 'number'){
- let d1 = new Date();
- let d2 = d1.setDate(d1.getDate() + Number(num));
- let n = new Date(d2).getDay();
- let s = '';
- switch (n){
- case 0 :
- s = "星期天";
- break;
- case 1 :
- s = "星期一";
- break;
- case 2 :
- s = "星期二";
- break;
- case 3 :
- s = "星期三";
- break;
- case 4 :
- s = "星期四";
- break;
- case 5 :
- s = "星期五";
- break;
- case 6 :
- s = "星期六";
- break;
- }
- return s;
- }else {
- alert('请输入正确数字!');
- }
- }
2.4 格式化日期
常见的日期格式化为字符串的方法有这些:
toDateString()-- 以特定于实现的格式显示星期几, 月, 日和年;
toTimeString()-- 以特定于实现的格式显示时, 分, 秒和时区;
toLocaleDateString()-- 以特定与地区的格式显示星期几, 月, 日和年;
toLocaleTimeString()-- 以特定于实现的格式显示时, 分, 秒;
toUTCString()-- 以特定于实现的格式完整的 UTC 日期.
获取并格式化日期: 年 - 月 - 日:
- function d (date){
- return date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate();
- }
- d(new Date()); // "2018-12-20"
日期字符串转为 年 - 月 - 日:
- function d (str){
- return new Date(Date.parse(str.replace(/-/g, '/')));
- // 或者
- // return new Date(str.replace(/-/g, '/'));
- }
获取当前星期几:
let d = "今天是星期" + "日一二三四五六".charat(new Date().getDay());
2.5 获取某年某月的天数
这里有个小技巧, 若给 new Date()传入一个如 aaaa/aa/0 参数时, 可以得到 aa 月的前一个月的最后一天, 如传入 2018/12/0 会得到 2018/11/30.
值得注意的是: 在 Chrome 浏览器上并不支持, 会返回 Invalid Date 导致结果为 NaN, 但是我们可以使用 aaaa,aa,0 形式作为参数, 下面分别写出这两种:
- // aaaa/aa/0 形式 只要传入年和月
- function d (y, m){
- m = parseInt(m, 10) + 1;
- let r = new Date(y + '/' + m + '/0');
- return r.getDate();
- }
- // aaaa,aa,0 形式 只要传入年和月
- function d (y, m){
- m = parseInt(m, 10) + 1;
- let r = new Date(y, m, 0);
- return r.getDate();
- }
2.6 获取上个月 / 下个月日期("yyyy-mm-dd")
传入参数的格式 "yyyy-mm-dd", 其实也可以是 Date()对象, 大家可以自行尝试.
- // 上个月 date 格式 "yyyy-mm-dd"
- function my_date (date){
- let arr = date.split('-');
- let y = arr[0] , m = arr[1], d = arr[2]; // 获取当前的年月日
- // ES6 语法 let [y,m,d] = arr;
- let day = new Date(y,m,0);
- day = day.getDate(); // 获取当前月份的天数
- let y2 = y, m2 = parseInt(m) - 1;
- if(m2 == 0){
- y2 = parseInt(y2) -1;
- m2 = 12;
- }
- let d2 = d, day2 = new Date(y2, m2, 0);
- day2 = day2.getDate();
- if(d2> day2){
- d2 = day2;
- }
- if(m2 <10){
- m2 = '0' + m2;
- }
- return y2 + '-' + m2 + '-' + d2;
- }
- my_date('2018-1-20'); //"2017-12-20"
下个月的计算方法也是相似:
- // 上个月 date 格式 "yyyy-mm-dd"
- function my_date (date){
- let arr = date.split('-');
- let y = arr[0] , m = arr[1], d = arr[2]; // 获取当前的年月日
- let day = new Date(y,m,0);
- day = day.getDate(); // 获取当前月份的天数
- // 和计算上个月的区别
- let y2 = y, m2 = parseInt(m) + 1;
- if(m2 == 13){
- y2 = parseInt(y2) + 1;
- m2 = 1;
- }
- let d2 = d, day2 = new Date(y2, m2, 0);
- day2 = day2.getDate();
- if(d2> day2){
- d2 = day2;
- }
- if(m2 < 10){
- m2 = '0' + m2;
- }
- return y2 + '-' + m2 + '-' + d2;
- }
- my_date('2018-12-20'); // "2019-01-20"
参考资料
1.MDN 数字和日期
2. JS 日期 Date 详解与实例扩展 https://www.cnblogs.com/moqiutao/p/4875946.html
本部分内容到这结束
Author | 王平安 |
---|---|
mailto:pingan8787@qq.com | |
博 客 | http://www.pingan8787.com |
微 信 | pingan8787 |
每日文章推荐 | https://github.com/pingan8787/Leo_Reading/issues |
ES 小册 | http://es.pingan8787.com |
来源: https://juejin.im/post/5c1bb5adf265da610f63b089