zoukankan      html  css  js  c++  java
  • JS日期、年月日、时分秒的无敌秘籍、文艺之行

    当前标准时间

    function format(fmt) {
        const date = new Date()
        const o = {
            "Y+": date.getFullYear(),
            "M+": date.getMonth() + 1,     // 月
            "D+": date.getDate(),          // 日
            "h+": date.getHours(),         // 时
            "m+": date.getMinutes(),       // 分
            "s+": date.getSeconds(),       // 秒
            "W": date.getDay()             // 周
        }
        for (var k in o) {
           if (new RegExp("("+ k +")").test(fmt)) {
                fmt = fmt.replace(RegExp.$1, () => {
                    if (k === 'W') {                                    // 星期几
                        const week = ['日', '一', '二', '三', '四', '五', '六']
                        return week[o[k]]
                    } else if (k === 'Y+' || RegExp.$1.length == 1) {    // 年份 or 小于10不加0
                        return o[k]
                    } else {
                        return ("00"+ o[k]).substr(("" + o[k]).length)  // 小于10补位0
                    }
                })
            }
        }
        return fmt
    }
    format('星期W')                  // 星期日
    format("YYYY-MM-DD hh:mm:ss")   // 2021-03-21 20:24:32
    format("MM/DD/YYYY hh:mm")      // 03-21-2021 20:24
    format("MM/DD/YYYY hh:mm")      // 03-21-2021 20:24 
    format("YYYY年MM月DD日 hh:mm:ss 星期W") // 2021年03月21日 20:30:14 星期日
    
    

    扩展性较强,可根据所需结构来使用和修改!

    时间戳转换

    我们在数据库存储时间字段的时候,一般都会以时间戳的标准来存储。

    在前端展示的时候,又该怎样让它变成一个正常的时间呢!

    首先来获取一下当前的时间戳,有以下三种方式:

    new Date().getTime()    // 精确到毫秒
    new Date().valueOf()    // 精确到毫秒
    Date.parse(new Date())  // 精确到秒
    
    // 第一个得到:1616330071538
    
    

    我们接着改造上面的方法:

    function format(fmt, timestamp) {
        const date = timestamp ? new Date(timestamp) : new Date()
        // ....
    }
    const a = format("YYYY-MM-DD hh:mm:ss")
    const b = format("YYYY年MM月DD日 hh:mm:ss 周W", 1616330071538)
    // a: 2021-03-21 20:48:30
    // b: 2021年03月21日 20:34:31 周日
    
    

    再添加一个时间戳的参数,只需把时间戳传进日期对象即可。

    在很久以前

    很久以前如果我们不曾相遇,如果没人说出那些话,那我们现在还会不会是朋友。偶然看到我们的聊天记录,时间停留在去年的某一个冬天,最后的信息让手机冷了心!

    如果能像计算器一样归零,那么你是否会选择重新开始?

    const time = (timestemp) => {
        const minute = 1000 * 60;
        const hour = minute * 60;
        const day = hour * 24;
        const month = day * 30;
        const year = month * 12;
        const diffValue = new Date().getTime() - timestemp; // 当前时间戳-原时间戳=相差时间
    
        // 如果本地时间小于变量时间
        if (diffValue <= 0) {
            return '现在'
        }
    
        // 计算差异时间的量级
        const yearC = diffValue / year;
        const monthC = diffValue / month;
        const weekC = diffValue / (7 * day);
        const dayC = diffValue / day;
        const hourC = diffValue / hour;
        const minC = diffValue / minute;
    
        // 从大到小排序 满足1以上即成立
        const map = {
            [yearC]: '年',
            [monthC]: "月",
            [weekC]: "周",
            [dayC]: "天",
            [hourC]: "小时",
            [minC]: "分钟",
        }
        for (let i in map) {
            if (i >= 1) {
                return `${parseInt(i)}${map[i]}前`
            }
        }
    }
    time(new Date().getTime()                // 现在
    time(new Date('2021-1-11').getTime()     // 2月前
    time(new Date('2021-2-22').getTime()     // 3周前
    time(new Date('2020-3-11').getTime()     // 1年前
    time(new Date('2019-3-11').getTime()     // 2年前
    time(new Date(1616330071538).getTime()   // 1小时前
    
    

    我们看到的朋友圈、留言评论、文章等,大部分会以相对时间来显示,这时候就需要前端进行实时处理了。

    时间的范围

    一个常见的场景:我们在网上买东西,都会有一个咨询客服的功能,当然客服也有上下班时间的,那么我们应该怎么判断当前时间是否在服务时间内呢。

    例如:客服上班时间(08:00-20:00)(08:30-20:30)

    // 第一种 很简单
    function time(beginTime, endTime){
        const timeNow = new Date().getHours()
        return timeNow >= beginTime && timeNow < endTime
    }
    time(8, 20)
    
    // 第二种 升级版
    function times(beginTime, endTime){
        const bDate = beginTime.split(':')
        const eDate = endTime.split(':')
        
        const o = {}
        const s = ['nDate', 'bDate', 'eDate']
    
        for (let i of s) {
            o[i] = new Date()
            let hours, minute;
            if (i == 'nDate') {
                hours = o[i].getHours()
                minute = o[i].getMinutes()
            } else {
                const arr = i == 'bDate' ? bDate : eDate
                hours = arr[0]
                minute = arr[1] || 0
            }
            o[i].setHours(hours)
            o[i].setMinutes(minute)
        }
        // 当前、开始、结束,三者的时间戳进行对比,答案就很清晰明了
        return o.nDate.getTime() - o.bDate.getTime() > 0 && o.nDate.getTime() - o.eDate.getTime() < 0
    }
    // 两种都支持
    console.log(times('8', '22'))
    console.log(times('8:30', '22:54'))
    
    

    重点为第二种,因为有分秒等判断操作,会比只判断时间更加复杂,最优的方式就是把关联性的时间各自转换成时间戳,再统一计算!(几年级的题??)

    前后七天日期

    根据前一天的日期依次递增,从而得到指定日期数组。
    后七天日期

    // 后七天日期
    function getAfterDate(){
        let date = new Date().getTime(), 
            result = [], 
            newDate, 
            month, 
            day;
        for (let i = 1; i < 8; i++) {
            newDate = date + i * 24 * 60 * 60 * 1000
            month = new Date(newDate).getMonth() + 1
            day = new Date(newDate).getDate()
            result.push(month + '-' + day)
        }
        return result
    }
    // ['3-23', '3-24', '3-25', '3-26', '3-27', '3-28', '3-29']
    
    

    前七天日期

    // 前七天日期
    function getBeforeDate(){
        let date = new Date().getTime(), 
            result = [], 
            newDate, 
            month, 
            day;
        for (let i = 7; i > 0; i--) {
            newDate = date - i * 24 * 60 * 60 * 1000
            month = new Date(newDate).getMonth() + 1
            day = new Date(newDate).getDate()
            result.push(month + '-' + day)
        }
        return result
    }
    // ['3-15', '3-16', '3-17', '3-18', '3-19', '3-20', '3-21']
    
    

    是否七天内日期

    限制选择日期的长度,比如Element-UI里面的日期选择器,限制只可选择七天内的日期。

    /**
     * @param {String} tcimestamp => '2020-05-08 19:46'
     */
    function a (timestamp) {
        timestamp = new Date(timestamp).getTime()
        const endTime = 24 * 60 * 60 * 1000 * 7
        const currentTime = new Date().setHours(0, 0, 0, 0)
        return currentTime <= timestamp && currentTime + endTime > timestamp
    }
    
    console.log(a('2021-3-23')) // true
    console.log(a('2021-3-29')) // true
    console.log(a('2021-3-30')) // false
    
    

    endTime:计算出7天的时间戳
    currentTime:把当天的时间设置为0点
    接着,回到上上步,客服上班的计算方式了!

    无敌且文艺、随意搭配

    /**
     * @param {String} tcimestamp => '2020-05-08 19:46'
     */
    function dateFormat(timestamp) {
        const w = new Date(timestamp).getDay()  // 获取周
    
        // 解析时间为数组
        timestamp = timestamp.toString().replace(/-|:|/| /g, ',').split(',')
        
        const week = ['日', '一', '二', '三', '四', '五', '六']
        const month = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二']
        const weekEn = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
        const monthEn = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec']
        const opt = ['Y', 'M', 'D', 'h', 'm', 'W'].reduce((t, v, i) => {
            t[v] = v === 'W' ? w : timestamp[i]
            return t
        }, {})
    
        // 日
        let st = 'st',
            nd = 'nd',
            rd = 'rd',
            th = 'th',
            obj = {
                1: st,
                2: nd,
                3: rd,
                21: st,
                22: nd,
                23: rd,
                31: st
            };
    
        let day = opt.D + (obj[opt.D] ? obj[opt.D] : th)
        day = day.startsWith(0) ? day.slice(1) : day    // 去除前面的0
    
        const time = {
            date: `${opt.Y}/${opt.M}/${opt.D} ${opt.h}:${opt.m}`,
            time: `${opt.h}:${opt.m}`,
            year: opt.Y,
            month: {
                on: opt.M,
                cn: month[Number(opt.M) - 1],
                en: monthEn[Number(opt.M) - 1]
            },
            day: {
                on: opt.D,
                en: day
            },
            week: {
                on: week[opt.W],
                en: weekEn[opt.W]
            }
        }
        return time
    }
    console.log(dateFormat('2020-05-08 19:46'))
    
    
    {
        date: '2020/05/30 19:46',
        time: '19:46',
        year: '2020',
        month: { on: '05', cn: '五', en: 'May' },
        day: { on: '08', en: '8th' },
        week: { on: '五', en: 'Friday' }
    }
    
    

    多了一些更多的选择,也让你所展示的时间更加多样化,丰富多彩。彰显出属于你独特的风格!

    Sometimes you need to applaud yourself
  • 相关阅读:
    hdu-1698(线段树,区间修改)
    hdu-1394(线段树)
    hdu-1166(线段树)
    hdu-1251(string+map)
    hdu-1711(kmp算法)
    hdu-2191(完全背包+二进制优化模板)
    hdu-2844(完全背包+二进制优化模板)
    hdu-1171(多重背包+二进制优化)
    SpringMVC 参数中接收数组、List写法
    如何高效的查询数组中是否包含某个值
  • 原文地址:https://www.cnblogs.com/tuziling/p/14810676.html
Copyright © 2011-2022 走看看