本文作者:IMWeb 九月 原文出处:IMWeb社区 未经同意,禁止转载
计算机处理时间一直都是以时间戳的方式进行的, 并且以 格林尼治时间 1970/1/1 0:0:0
开始计算的:
var date = new Date(0);
date.toString() // Thu Jan 01 1970 08:00:00 GMT+0800 (中国标准时间)
date.toGMTString() // Thu, 01 Jan 1970 00:00:00 GMT
date.toUTCString() // Thu, 01 Jan 1970 00:00:00 GMT
时间的格式化在前端是再正常不过的需求了, 所以会有类似的实现:
function formatDate(pattern, date) {
date = new Date(date);
function formatNumber(data, format) {
data = data || 0;
format = format.length;
return format === 1 ? data : String(Math.pow(10, format) + data).slice(-format);
}
return pattern.replace(/([YMDhsmw])\1*/g, function(format) {
switch (format.charAt()) {
case 'Y':
return formatNumber(date.getFullYear(), format);
case 'M':
return formatNumber(date.getMonth() + 1, format);
case 'D':
return formatNumber(date.getDate(), format);
case 'h':
return formatNumber(date.getHours(), format);
case 'm':
return formatNumber(date.getMinutes(), format);
case 's':
return formatNumber(date.getSeconds(), format);
case 'w':
return date.getDay();
}
});
}
视频时长的问题
, 后台返回的是 以秒为单位的数字
, 要处理成 hh:mm:ss
这种格式, 在代码里搜了一下, 找到如下实现:function timeLen(time_len) { function fillZero(value) { return ('0' + value).slice(-2, 3); } return fillZero(Math.floor(time_len / 3600)), fillZero(Math.floor(time_len % 3600 / 60)), fillZero(time_len % 60) .join(':'); }借助于 formatDate, 也可以这么写:
function timeLenFormat(time_len) {
return formatDate('hh:mm:ss', new Date(time_len * 1000 + (new Date).setHours(0, 0, 0, 0)));
};
N个月以后
, 比如 2015/8/31
的 3 个月以后就是 2015/11/30
, 月份 +N
很简单, 但是月底要特殊处理, 你不可能输出 2015/11/31
, 遇到月底的情况, 这个问题就变成了计算某个月份有多少天了, 平年闰年大小月什么的, 这么简单的问题怎么能想得这么复杂, 所幸 Date
对象支持设置超出范围的日期, 利用这一点:
function getDateNextMonth(month, date) { date = date || new Date; var tmp = date.getDate(); date.setMonth(date.getMonth() + month); return tmp === date.getDate() ? date : new Date(date.setDate(1) - 8.64e7); };