js 时间获取函数 and 友好时间显示

update date:         2019.09.14

update content:    加入了时间友好显示,两种逻辑在末尾,其实都还可以优化的,当然,具体就不优化了,睡会儿觉先。

/*
	2018.03.29
	时间函数文件(js 时间笔记)
	author:		陈、二先生
	email:		2416743126@qq.com
*/
/*
	update date:		2018.03.30
	update content:		function TimeDate param add Time
						//	好吧,装不下去了。更新了函数 TimeDate 支持传入第二个参数时间戳,第一个参数输入日期格式,第二个参数填写时间戳(由于 js 的原因,时间戳是毫秒级的,多多注意)
	ps:					发布的时候忘了说的就是,js 的时间戳是毫秒级的。嗯,就这么多。
*/


/**
*    function:    TimeDate                          时间显示格式化
*    @return:     string                            根据参数 p 格式化 t 参数以字符串返回
*    @param:      string        p                   传入将 t 格式化的格式标准,如不传入返回当前时间戳,或传入具体时间获取时间戳返回,又或者传入时间戳,返回格式为 Y-m-d H:i:s 的日期
*    @param:      int           t                   传入需要依据参数 p 格式化的时间戳,如不传入,默认当前时间
*/
function TimeDate(p = null,t = null){
	obj = new Date;
	var time;										//	准备返回
	switch(true){
		case (p === null):
			time = Date.parse(new Date());          //  当参数为空则,返回当前时间戳
			break;
		case (isNaN(p)):
			/*
				传入时间格式,将转换当前时间
				目前只有以下格式,需要的自行补充.
				Y	1996 	格式年份
				m 	03		格式月份
				d 	03		格式天数
				
				H	23		格式小时
				i 	03		格式分钟
				s 	03		格式秒钟
				
				参数:
					"Y年m月d日 H时i分s秒"
				返回:
					"2018年03月29日 16时29分03秒"
			*/
			var arr = new Array;
			arr = {"Y":"TimeYear","m":"TimeMonth","d":"TimeDay","H":"TimeHour","i":"TimeMinute","s":"TimeSecond"};
			if(isNaN(parseInt(p))){
				time = '';
				if(t === null){
					t = TimeDate();                    //    当不设置 t 参数时,获取当前时间戳
				}
				for(var i = 0;i < p.length ; i++){
					if(arr[p[i]] != undefined){
						var fun = arr[p[i]];
						eval('time += ' + fun + '("' + t + '");');
					}else{
						time += p[i];
					}
				}
			}else{
				/*
					传入具体日期,将被返回时间戳
				*/
				time = new Date(p.replace(/-/g, '/')).valueOf();
			}
			break;
		default:
			/*
				传入数字将直接被返回标准格式的日期(当然是我定的标准了)
			*/
			time = TimeYear(p) + '-' + TimeMonth(p) + '-' + TimeMonth(p) + ' ' + TimeHour(p) + ':' + TimeMinute(p) + ':' + TimeSecond(p);
	}
	return time;									//	结果返回
}

/*
	时间 年 1996 格式
*/
function TimeYear(num = null){
	if(num === null){
		var obj = new Date;
	}else{
		var obj = new Date(parseInt(num));
	}
	var Year = obj.getFullYear();
	Year = ozeAdd(Year);
	return Year;
}

/*
	时间  月 03 格式
*/
function TimeMonth(num = null){
	if(num === null){
		var obj = new Date;
	}else{
		var obj = new Date(parseInt(num));
	}
	var Month = obj.getMonth()+1;
	Month = ozeAdd(Month);
	return Month;
}

/*
	时间 天 03 格式
*/
function TimeDay(num = null){
	if(num === null){
		var obj = new Date;
	}else{
		var obj = new Date(parseInt(num));
	}
	var Day = obj.getDate();
	Day = ozeAdd(Day);
	return Day;
}

/*
	时间 小时 03 格式
*/
function TimeHour(num = null){
	if(num === null){
		var obj = new Date;
	}else{
		var obj = new Date(parseInt(num));
	}
	var Hour = obj.getHours();
	Hour = ozeAdd(Hour);
	return Hour;
}

/*
	时间 分钟 03 格式
*/
function TimeMinute(num = null){
	if(num === null){
		var obj = new Date;
	}else{
		var obj = new Date(parseInt(num));
	}
	var Minute = obj.getMinutes();
	Minute = ozeAdd(Minute);
	return Minute;
}

/*
	时间 秒 03 格式
*/
function TimeSecond(num = null){
	if(num === null){
		var obj = new Date;
	}else{
		var obj = new Date(parseInt(num));
	}
	var Second = obj.getSeconds();
	Second = ozeAdd(Second);
	return Second;
}

//	补零函数
function ozeAdd(num){
	if(!isNaN(num)){
		num = parseInt(num);							//	转换成整型用于计算
		if(num < 10){
			num = String(num);							//	转换为字符串
			num = '0' + num;
		}
		return num;
	}else{
		return num;
	}
}


/**
*    function:    friendly_time()                                   友好时间
*    @return:     string                                            根据传入参数 timeS 返回友好化的时间显示结果
*    @param:      int    startTimeS                                 时间戳
*    @param:      array  timeDisplayLv                              传入显示级别数组,[[displayName,multiple[,functionName]][,[displayName,multiple[,functionName]]...]]]
*/
function friendly_time(startTimeS = 0,timeDisplayLv = false){
    var d_value = 0;                                                //    时间差,默认为 零
    var minNum = 60000;                                             //    最小时间,当小于该值则使用最小显示,因为js 时间戳是毫秒级,这里也是用的毫秒数值
    var maxNum = (30 * 24 * 3600 * 30000);                          //    最大显示

    if(startTimeS){
        d_value = new Date().getTime() - startTimeS;
    }
    if(d_value < minNum){
        return '刚刚';
    }else if(d_value > maxNum){
        return TimeDate('Y-m-d H:i:s',startTimeS);
    }else{
        var num = 0;
        var isTrueReturn = 0;                                        //    是否成功返回结果,是则不进行最后计算
        if(!timeDisplayLv){
            timeDisplayLv = [['周前',(7 * 24 * 3600)],['天前',(24 * 3600)],['小时前',3600],['分钟前',60]];
        }
        for(var i = 0;i < timeDisplayLv.length;i++){
            num = d_value / timeDisplayLv[i][1];
            if(num > 1){
                var funName = timeDisplayLv[i][2];                  //    回调参数名称
                if(timeDisplayLv[i][2]){
                    var result = window[funName](num,d_value,i);    //    这里可以针对一些特殊时间段进行处理,如 1 天前 可以通过回调函数修改为 昨天 返回。
                }else{
                    var result = (int)num + timeDisplayLv[i][0];
                }
                return result;
            }
        }
    }
}



//    另一个一种方式,需要过的判断比较多
function friendlyTime(startTimeS){
    var d_value = 0;
    var newTime = new Date().getTime();
    var minNum = 60000;
    var maxNum = (30 * 24 * 3600 * 30000);
    var oldYear = parseInt(TimeYear(startTimeS));
    var newYear = parseInt(TimeYear(newTime));
    var num = newYear - oldYear;
    var displayStr = '';
    d_value = newTime - startTimeS;
    if(d_value < minNum){
        return '刚刚';
    }else if(d_value > maxNum ){
        return TimeDate('Y-m-d H:i:s',startTimeS);
    }else if(num > 0){
        var oldMonth = parseInt(TimeMonth(startTimeS));
        var newMonth= parseInt(TimeMonth(newTime));
        num = newYear - oldYear;
        if(num > 0){
            //....    其实这样一层一层的写下去对代码页不太友好,可以放入一个数组,然后遍历调用,更多的逻辑在这里不写下去了。
        }else{
            switch(num){
             case 1:
                displayStr = '上个月';
                break;
             default:
                displayStr = num + '个月前';
         }
        }
    }else{
         switch(num){
             case 1:
                displayStr = '去年';
                break;
             case 2:
                displayStr = '前年';
                break;
             default:
                displayStr = num + '年前';
         }
         return ;
    }
}

 

  代码送上,2018.03.29 日笔记备忘。因为发现自己好像有了神经衰弱的现象,所以更急迫于做备忘了??各位看众如果有更好的优化方案,望不吝赐教。为了更好的代码,我说,程序员的使命就是改变世界,但也深知自己的路还很远,特别是有了一些神经衰弱的现象之后更明显得感觉自己能吸收的东西更少了。为了改变世界。谢谢。对了,迷之往前段的工作量更多了。。。还是说后端实在是没啥事做了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值