0
点赞
收藏
分享

微信扫一扫

【JS】126-重温基础:时间对象

【JS】126-重温基础:时间对象_字符串

本文是 重温基础 系列文章的第七篇。 今日感受:做好自律。

本章节复习的是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对象的字符串格式的值。
  • " ​parse​​和 ​UTC​":用于解析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 获取某年某月的天数

这里有个小技巧,若给 ​newDate()​​传入一个如 ​aaaa/aa/0​​参数时,可以得到 ​aa​月的前一个月的最后一天,如传入 ​2018/12/0​​会得到 ​2018/11/30​。

值得注意的是: 在Chrome浏览器上并不支持,会返回 ​InvalidDate​​导致结果为 ​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详解与实例扩展

【JS】126-重温基础:时间对象_字符串_02



举报

相关推荐

0 条评论