由于博客全部改版为PJAX(pushState + ajax)。因此,类似于作品等列表都是使用接口读的,后台返回的时间是一个MySQL时间戳,并不能直接使用,需要格式化成指定的字符串。以前这些都是后台搞完返回,现在需要在前端去实现,总结了下博客改版过程中使用到的关于日期时间的方法,主要有parseTime格式化和timeAgo多久之前两个方法。前者就是我们常见到的类似于2015-12-30 12:00、12月20日这种,后者则是类似于2天前,3周前这种,都是比较常用的。
parseTime()
/**
* 格式化日期
* @param timestamp 数据库时间戳
* @param format 如 y-m-d h:i:s
* @param full 是否补零 5 => 05
* @returns {string}
*/
function parseTime(timestamp,format,full){
full = full != undefined ? full : true;
timestamp = timestamp * 1000;
if(!format) format = "y-m-d h:i:s";
format = format.toLowerCase();
function zeroFull(str){
return full ? (str >= 10 ? str : ('0' + str)) : str;
}
var time = new Date(timestamp),
o = {
y : time.getFullYear(),
m : zeroFull(time.getMonth() + 1),
d : zeroFull(time.getDate()),
h : zeroFull(time.getHours()),
i : zeroFull(time.getMinutes()),
s : zeroFull(time.getSeconds())
};
return format.replace(/([a-z])(\1)*/ig,function(m){
return o[m];
});
}
console.log(parseTime(1451460186,"y年m月d日 h:i"));
//2015年12月30日 15:23
console.log(parseTime(1451460186,"y-m-d h:i"));
//2015-12-30 15:23
console.log(parseTime(1451460186,"m-d h:i"));
//12-30 15:23
console.log(parseTime(1451460186,"h:i"));
//15:23 1
timeAgo()
/**
* 多久之前
* @param stamp 数据库时间戳
* @param format 对于不在范围的日期格式化 如 y-m-d h:i:s
* @param max 最大级别 默认 月
* @returns {string}
*/
function timeAgo(stamp,format,max) {
max = max ? parseInt(max) : 2592000;
var now = (new Date() * 1) / 1000,
time = now - stamp,
text = {
31536000 : "年",
2592000 : "个月",
604800 : "周",
86400 : "天",
3600 : "小时",
60 : "分钟",
1 : "秒"
};
var back = "";
if(time <= max){
for(var k in text){
var c = Math.floor(time / parseInt(k));
if( 0 != c ){
if(text[k] == "天" && c <= 2){
back = (((c == 1) ? "昨天" : "前天") + parseTime(stamp,"h:i"));
}else{
back = (c + text[k] + "前");
}
}
}
}else{
back = parseTime(stamp,format);
}
return back;
}
console.log(timeAgo(1451460186,"m-d h:i"));
//3小时前