本章节复习的是JS中的时间对象,一些处理的方法。

前置知识
JavaScript中的时间是以1970年1月1日00:00:00以来的毫秒数来储存数据类型。
Data对象的范围是相对距离UTC1970年1月1日的前后100,000,000天。
创建一个时间对象:

  1. let d = new Date([params]);

参数params可以是:

  • 无参数:默认创建今天的日期和时间。
  • 一个符合以下格式的表示日期的字符串:

“月 日, 年 时:分:秒.”或者”年月日 时分秒”

  1. let d = new Date("2018-12-20");

如果你省略时、分、秒,那么他们的值将被设置为0。

  • 一个年,月,日的整型值的集合:
  1. let d = new Date(2018, 12, 20);
  • 一个年,月,日,时,分,秒的集合:
  1. let d = new Date(2018, 12, 20, 23, 20, 10);

这里Date对象涉及到的方法特别多,请移步W3school JavaScript Date 对象

1.Date对象的方法

常用处理的方法有以下几类:

  • set“:用于设置Date对象的日期和时间的值。
  • get“:用去获取Date对象的日期和时间的值。
  • to“:用于返回Date对象的字符串格式的值。
  • parseUTC“:用于解析Date字符串。

需要注意的Date对象的一些数值问题:

  • 秒/分: 0 - 59;
  • 时: 0 - 23;
  • 星期: 0(周日) - 6(周六)
  • 日期: 1 - 31
  • 月份: 0(一月) - 11(十二月)
  • 年份: 从1900开始的年数

例如:

  1. let d = new Date('2018-12-10');
  2. let d1 = d.getMonth(); // 11
  3. let d2 = d.getFullYear(); // 2018

获取今年剩下的天数:

  1. let d = new Date();
  2. let e = new Date(2018, 11, 31, 23, 59, 59, 999); // 设置年月日时分秒
  3. e.setFullYear(d.getFullYear); // 设置为今年
  4. let m = 24 * 60 * 60 * 1000; // 每日毫秒数
  5. let result = (e.getTime() - d.getTime()) / m;
  6. result = Math.round(result); // 返回今年剩余天数

这里Date对象涉及到的方法特别多,请移步W3school JavaScript Date 对象

注意:

格林尼治标准时间(GMT)英国、爱尔兰、冰岛和葡萄牙属于该时区。这个时区与中国北京时间的时差是8个小时,也就是说比北京时间晚8个小时。

2.使用Date对象

2.1 设置日期

为一个时间对象设置指定日期(2018年12月20日),注意这里:和前面说的一样,12月在JS的Date对象中,是用11表示。

  1. let d = new Date();
  2. d.setFullYear(2018,11,20);

设置时间对象10天以后:

  1. let d = new Date();
  2. d.setDate(d.getDate() + 10); // 先获取当天的日期,再设置到指定天数以后

2.2 比较时间

通常情况下,像下面这样简单比较:

  1. let d = new Date();
  2. let e = new Date();
  3. d.setFullYear(2018,10,10);
  4. let r = d > e ? 'good' : 'nice' ; // nice

还可以比较两个日期相差多少天:

  1. let d1 = new Date('2018-10-10');
  2. let d2 = new Date('2018-11-11');
  3. let d3 = (d2 - d1) / (1000 * 60 * 60 * 24); // 32

2.3 计算N天后星期几

  1. function d (num){
  2. if(typeof Number(num) === 'number'){
  3. let d1 = new Date();
  4. let d2 = d1.setDate(d1.getDate() + Number(num));
  5. let n = new Date(d2).getDay();
  6. let s = '';
  7. switch (n){
  8. case 0 :
  9. s = "星期天";
  10. break;
  11. case 1 :
  12. s = "星期一";
  13. break;
  14. case 2 :
  15. s = "星期二";
  16. break;
  17. case 3 :
  18. s = "星期三";
  19. break;
  20. case 4 :
  21. s = "星期四";
  22. break;
  23. case 5 :
  24. s = "星期五";
  25. break;
  26. case 6 :
  27. s = "星期六";
  28. break;
  29. }
  30. return s;
  31. }else {
  32. alert('请输入正确数字!');
  33. }
  34. }

2.4 格式化日期

常见的日期格式化为字符串的方法有这些:

  • toDateString()——以特定于实现的格式显示星期几、月、日和年;
  • toTimeString()——以特定于实现的格式显示时、分、秒和时区;
  • toLocaleDateString()——以特定与地区的格式显示星期几、月、日和年;
  • toLocaleTimeString()——以特定于实现的格式显示时、分、秒;
  • toUTCString()——以特定于实现的格式完整的UTC日期。

获取并格式化日期:年-月-日

  1. function d (date){
  2. return date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate();
  3. }
  4. d(new Date()); // "2018-12-20"

日期字符串转为 年-月-日

  1. function d (str){
  2. return new Date(Date.parse(str.replace(/-/g, '/')));
  3. // 或者
  4. // return new Date(str.replace(/-/g, '/'));
  5. }

获取当前星期几

  1. 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形式作为参数,下面分别写出这两种:

  1. // aaaa/aa/0形式 只要传入年和月
  2. function d (y, m){
  3. m = parseInt(m, 10) + 1;
  4. let r = new Date(y + '/' + m + '/0');
  5. return r.getDate();
  6. }
  7. // aaaa,aa,0形式 只要传入年和月
  8. function d (y, m){
  9. m = parseInt(m, 10) + 1;
  10. let r = new Date(y, m, 0);
  11. return r.getDate();
  12. }

2.6 获取上个月/下个月日期(“yyyy-mm-dd”)

传入参数的格式”yyyy-mm-dd”,其实也可以是Date()对象,大家可以自行尝试。

  1. // 上个月 date格式"yyyy-mm-dd"
  2. function my_date (date){
  3. let arr = date.split('-');
  4. let y = arr[0] , m = arr[1], d = arr[2]; // 获取当前的年月日
  5. // ES6语法 let [y,m,d] = arr;
  6. let day = new Date(y,m,0);
  7. day = day.getDate(); // 获取当前月份的天数
  8. let y2 = y, m2 = parseInt(m) - 1;
  9. if(m2 == 0){
  10. y2 = parseInt(y2) -1;
  11. m2 = 12;
  12. }
  13. let d2 = d, day2 = new Date(y2, m2, 0);
  14. day2 = day2.getDate();
  15. if(d2 > day2){
  16. d2 = day2;
  17. }
  18. if(m2 < 10){
  19. m2 = '0' + m2;
  20. }
  21. return y2 + '-' + m2 + '-' + d2;
  22. }
  23. my_date('2018-1-20'); //"2017-12-20"

下个月的计算方法也是相似:

  1. // 上个月 date格式"yyyy-mm-dd"
  2. function my_date (date){
  3. let arr = date.split('-');
  4. let y = arr[0] , m = arr[1], d = arr[2]; // 获取当前的年月日
  5. let day = new Date(y,m,0);
  6. day = day.getDate(); // 获取当前月份的天数
  7. // 和计算上个月的区别
  8. let y2 = y, m2 = parseInt(m) + 1;
  9. if(m2 == 13){
  10. y2 = parseInt(y2) + 1;
  11. m2 = 1;
  12. }
  13. let d2 = d, day2 = new Date(y2, m2, 0);
  14. day2 = day2.getDate();
  15. if(d2 > day2){
  16. d2 = day2;
  17. }
  18. if(m2 < 10){
  19. m2 = '0' + m2;
  20. }
  21. return y2 + '-' + m2 + '-' + d2;
  22. }
  23. my_date('2018-12-20'); // "2019-01-20"

参考资料

1.MDN 数字和日期
2. JS日期Date详解与实例扩展


本部分内容到这结束

Author 王平安
E-mail pingan8787@qq.com
博 客 www.pingan8787.com
微 信 pingan8787
每日文章推荐 https://github.com/pingan8787/Leo_Reading/issues
ES小册 js.pingan8787.com