zoukankan      html  css  js  c++  java
  • 【重温基础】7.时间对象

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

    系列目录:

    本章节复习的是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对象的字符串格式的值。
    • parseUTC”:用于解析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详解与实例扩展


    本部分内容到这结束

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

    bg

    个人博客:http://www.pingan8787.com 微信公众号【前端自习课】和千万网友一起,每日清晨,享受一篇前端优秀文章。 目前已连续推送文章 600+ 天,愿每个人的初心都能一直坚持下去!
  • 相关阅读:
    CEF解决加载慢问题
    CEF之CefSettings设置locale
    Win32程序支持命令行参数的做法(转载)
    VC++实现程序重启的方法(转载)
    CEF之CefSettings设置日志等级
    libcurl开源库在Win32程序中使用下载文件显示进度条实例
    libcurl开源库在Win7 + VS2012环境下编译、配置详解 以及下载文件并显示下载进度 demo(转载)
    使用ShellExecute打开目标文件所在文件夹并选中目标文件
    linux下gimp的使用
    linux下的chm阅读器?
  • 原文地址:https://www.cnblogs.com/pingan8787/p/11838219.html
Copyright © 2011-2022 走看看