zoukankan      html  css  js  c++  java
  • 日期相关的小函数汇总

    在写日历组件和旅行相关频道开发的过程中,很多需要地方需要和日期对象打交道。拿京东旅游首页来说, 左上角的搜索框就包含了许多日期相关的交互逻辑,它包含了机票,酒店,度假等,这些都含有出发日期,到达日期等。

    里面还包含了一个日期组件,在用户选择完出发日期后,会自动把到达日期定位在出发日期的下一天。


    又如机票低价日历


    还有度假的这种特殊日历

    以下是经常需要用到日期相关小函数


    一、 判断闰年
    这个函数在日历组件是必须要的,闰年的2月是29天,非闰年是28天

    /*
     * 判断闰年
     * @param  {Number} 年
     * @return {Blooean}
     */
    function isLeapYear(year) {
        return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
    }
    isLeapYear(2015) // false
    isLeapYear(2016) // true
    

      

    二、补齐月,日数字位数

    通过Date对下的getMonth,getDate返回的数字如果是10以下的需要在前面补齐一个0。这里需要注意的是getMonth返回的月份是从0开始的,即0代表1月份,1代表2月份,依次类推。

    /*
     * 补齐月,日数字位数
     * @param {number|string} n 需要补齐的数字
     * @return {string} 补齐两位后的字符
     */
    function getTwoBit(n) {
        return (n > 9 ? '' : '0') + n
    }
    getTwoBit(3)  // '03'
    getTwoBit(9)  // '09'
    getTwoBit(10) // '10'
    getTwoBit(11) // '11'
    

      

    三、Date对象转成日期格式字符串

    有两种格式"2015-01-22" 和 "2015/01/23"

    /*
     * 日期对象转成字符串
     * @param  {Date} new Date()
     * @split  {String} "-" 或 "/"
     * @return {String} "2014-12-31" 
     */
    function date2Str(date, split) {
        split = split || '-'
        var y = date.getFullYear()
        var m = getTwoBit(date.getMonth() + 1)
        var d = getTwoBit(date.getDate())
        return [y, m, d].join(split)    
    }
    

    四、日期格式字符串转成Date对象

    /*
     * 日期字符串转成Date对象
     * @param {String} str
     *   "2014-12-31" 
     *   "2014/12/31"
     * @return {Date} 
     */
    function str2Date(str) {
        var reDate = /^d{4}-d{1,2}-d{1,2}/
        if (reDate.test(str)) {
            str = str.replace(/-/g, '/')
        }
        return new Date(str)
    }

    这里需要注意下,不能直接 new Date('2014-12-31'),横线间隔的日期格式字符串作为参数传给Date构造器不是所有浏览器都支持

    五、根据数字返回特定的天

    比如旅行频道出发日期一般是第二天(明天),返程日期是第三天(后天)

    这个函数根据数字返回特定的日期字符串

    /*
     * 返回日期格式字符串
     * @param {Number} 0返回今天的日期、1返回明天的日期,2返回后天得日期,依次类推
     * @return {string} '2014-12-31'
     */
    function getSpecDay(i) {
        i = i || 0
        var date = new Date
        var diff = i * (1000 * 60 * 60 * 24)
        date = new Date(date.getTime() + diff)
        return date2Str(date)
    }
    getSpecDay(0) // 2014-12-31
    getSpecDay(1) // 2015-01-01
    

      

    六、根据Date对象获取星期

    有的需求要显示的是 “周三”,有的则是 “星期三”

    /*
     * 根据Date对象获取周几
     * @param date {Date|String} 如 '2014-12-22'
     * @param isFormal {Boolean} 
     * @return '周一' 或 '星期一'
     */ 
    function getWeekByDate(date, isFormal) {
        var obj = null
        var weekArr1 = ['周日','周一','周二','周三','周四','周五','周六']
        var weekArr2 = ['星期日', '星期一','星期二','星期三','星期四','星期五','星期六']
        if (typeof date == 'string') {
            obj = str2Date(date)
        } else if (date instanceof Date) {
            obj = date
        }
        var num = obj.getDay()
        return isFormal ? weekArr2[num] : weekArr1[num]
    }
    

    七、根据年获取生肖

    /*
     * 根据年获取生肖
     *
     * **参数**
     *  year {number} 年
     *
     * **示例**
     *  getAnimal(1980) // "猴"
     *  getAnimal(1981) // "鸡"
     *  getAnimal(2013) // "蛇"
     */ 
    function getAnimal(year) {
        var animals = ['鼠', '牛', '虎', '兔', '龙', '蛇', '马', '羊', '猴', '鸡', '狗', '猪'];
        var i = (year - 4) % 12;
        return animals[i];
    }
    

    八、根据年月返回该月的两个节气,一个公历月有两个节气

    /*
     * 根据年月返回该月的两个节气,一个公历月有两个节气
     * 
     * **节气算法**
     *  http://ershisijieqi.baike.com/article-284624.html
     *  http://www.azg168.com/huangli/24sijieqi/28337.html
     *  http://blog.csdn.net/orbit/article/details/7910220
     *
     * **参数**
     *  year  {number} 年 
     *  month {number} 月
     *
     * **返回**
     *  object
     * 
     * **示例**
     *  getSolarTerm(2016, 4); // {day1: 4, term1: "清明", day2: 19, term2: "谷雨"}
     *
     */
    function getSolarTerm(year, month) {
        var solarTerm = [
            "小寒", "大寒", 
            "立春", "雨水", 
            "惊蛰", "春分", 
            "清明", "谷雨", 
            "立夏", "小满", 
            "芒种", "夏至", 
            "小暑", "大暑", 
            "立秋", "处暑", 
            "白露", "秋分", 
            "寒露", "霜降", 
            "立冬", "小雪", 
            "大雪", "冬至"
        ];
        var termInfo = [
            0, 21208, 42467, 63836, 85337, 107014, 
            128867, 150921, 173149, 195551, 218072, 
            240693, 263343, 285989, 308563, 331033, 
            353350, 375494, 397447, 419210, 440795, 
            462224, 483532, 504758
        ];
        // 返回某年的第n个节气为几日(从0小寒起算)
        function computeTermDay(y, n) {
            var d = new Date((31556925974.7 * (y - 1900) + termInfo[n] * 60000) + Date.UTC(1900, 0, 6, 2, 5));
            return d.getUTCDate();
        }
    
        // month 转为 [0-11] 范畴
        month = month - 1;
    
        // 计算节气
        var n1 = month * 2;
        var n2 = month * 2 + 1;
        // day1, day2 为当月的两个节气日
        var day1 = computeTermDay(year, n1);
        var day2 = computeTermDay(year, n2);
        // 当月的两个节气名称
        var term1 = solarTerm[n1];
        var term2 = solarTerm[n2];
    
        // 返回结果
        return {
            day1: day1,
            term1: term1,
            day2: day2,
            term2: term2
        };
    }
    

    九、获取Y年的清明节是哪一天

    /*
     * 获取Y年的清明节是哪一天
     *  
     * **参数**
     *  yare {number} 年
     *
     * **示例**
     *  getQingMing(2015); // 0405
     *  getQingMing(2016); // 0404
     */
    function getQingMing(year) {
        // [Y*D+C]-L
        // Y=年数后2位,D=0.2422,L=闰年数,21世纪C=4.81,20世纪=5.59
        var d = 0.2422;
        var c = 4.81;
        var y = (year + '').substr(2);
        var day = parseInt(y*d+c) - parseInt(y/4);
        return day;
    }
    

     

  • 相关阅读:
    bin/sh^M: bad interpreter: No such file or directory解决
    1.2前置条件
    LINUXIPCS信息
    动态添加样式表规则第3版
    Google放出C++代码风格规范
    我的模块加载系统 v4
    有关婚姻的名言
    javascript 测试工具abut v3
    全世界最短的domReady
    javascript 模板系统 ejs v7
  • 原文地址:https://www.cnblogs.com/snandy/p/4239447.html
Copyright © 2011-2022 走看看