Javascript模糊时间(例如'10分钟前');s精确到几秒钟
Javascript fuzzy time (e.g '10 minutes ago') that's in exact seconds
我正在制作一个计算"秒前"的javascript计数器。我在一个JS时间对象中有我的时间,我在这里发现了一个关于堆栈溢出的"时差"函数片段,但它显示为"2小时前"。我如何才能让它显示"5小时10分37秒前"
以下是我正在使用的内容:
该函数将当前时间和时间戳转换为"20秒前",而不是神秘的日期:
function timeDifference(current, previous) {
var msPerMinute = 60 * 1000;
var msPerHour = msPerMinute * 60;
var msPerDay = msPerHour * 24;
var msPerMonth = msPerDay * 30;
var msPerYear = msPerDay * 365;
var elapsed = current - previous;
if (elapsed < msPerMinute) {
return Math.round(elapsed/1000) + ' seconds ago';
} else if (elapsed < msPerHour) {
return Math.round(elapsed/msPerMinute) + ' minutes ago';
} else if (elapsed < msPerDay ) {
return Math.round(elapsed/msPerHour ) + ' hours ago';
} else if (elapsed < msPerMonth) {
return 'approximately ' + Math.round(elapsed/msPerDay) + ' days ago';
} else if (elapsed < msPerYear) {
return 'approximately ' + Math.round(elapsed/msPerMonth) + ' months ago';
} else {
return 'approximately ' + Math.round(elapsed/msPerYear ) + ' years ago';
}
}
这是我用来"计算"每秒钟的时间的方法。我想说"5小时3分10秒前",然后1秒后,"5小时、3分11秒前"
var newTime = new Date(data.popular[i].timestamp*1000)
var relTime = timeDifference(new Date(),newTime)
setInterval(function(){
var theTimeEl = $('.timestamp-large').filter(function(){
return $(this).html() == relTime
});
newTime.setSeconds(newTime.getSeconds() + 1);
var relTime = timeDifference(new Date(), newTime);
$(theTimeEl).html(relTime);
console.log(relTime)
}, 1000)
变量newTime是UTC javascript日期格式的时间。relTime是"秒前"格式。间隔循环通过一组时间戳元素,并为每个时间戳选择正确的时间戳元素。然后,它在时间上添加一秒,将其转换回"模糊时间"(秒前),用新时间替换html,并将其记录在控制台中。
如何将"5小时前"更改为"5小时37分钟10秒前"?时差函数需要修改
这里有一个接近您所要求的函数。
var timeparts = [
{name: 'year', div: 31536000000, mod: 10000},
{name: 'day', div: 86400000, mod: 365},
{name: 'hour', div: 3600000, mod: 24},
{name: 'minute', div: 60000, mod: 60},
{name: 'second', div: 1000, mod: 60}
];
function timeAgoNaive(comparisonDate) {
var
i = 0,
l = timeparts.length,
calc,
values = [],
interval = new Date().getTime() - comparisonDate.getTime();
while (i < l) {
calc = Math.floor(interval / timeparts[i].div) % timeparts[i].mod;
if (calc) {
values.push(calc + ' ' + timeparts[i].name + (calc != 1 ? 's' : ''));
}
i += 1;
}
if (values.length === 0) { values.push('0 seconds'); }
return values.join(', ') + ' ago';
}
console.log(timeAgoNaive(new Date(Date.parse('Jun 12 2006 11:52:33'))));
console.log(timeAgoNaive(new Date(new Date().getTime() - 3600000)));
console.log(timeAgoNaive(new Date()));
结果:
6 years, 33 days, 4 hours, 52 minutes, 22 seconds ago
1 hour ago
0 seconds ago
我称之为"天真",因为它并没有真正关注我们计算时间的人类方式。如果它是"1/1/2013 12:01:00 am",与"1/1/2012 12:01:00 am"相比,应该产生"1年零个月零天零小时零分钟零秒前"。但它不会通过扩展您所介绍的函数中的逻辑来实现这一点,在我的函数中也不会实现这一目标(加上我的函数不会使用几个月)。一个比365天更好的年份近似值是365.24,但这也被忽略了。
我按照您的要求排除了空的时间部分,当找不到时间部分时,至少保留"0秒"。
现在,如果你想要像人类一样的计算方式,你必须决定一些事情。你不能只使用越界,因为2月28日至3月1日不是一个完整的月。其次,这里有一个问题将暴露真正的问题:
- 2月2日至3月31日是多少个月和几天
如果将2月2日至3月2日计算为一个月,则为1个月29天。但如果是1月2日至3月1日呢?这是他们之间经过的相同天数。现在是1个月(整个4月)+3月的1天+1月的31天,1个月32天吗?你想让你的月份与物理日历重合吗?这样人类就可以用手指追踪并从中得到正确的日期吗?这比你想象的要困难得多。
如果你能用合理而完整的规则来回答你将如何进行"类似人类的逝去时间计算",那么也许我可以给你写另一个函数来完成它
更新
这是一个新的功能,可以工作几个月,一年有365.24天(一个月有30.43666666天):
var timeparts = [
{name: 'millenni', div: 31556736000, p: 'a', s: 'um'},
{name: 'centur', div: 3155673600, p: 'ies', s: 'y'},
{name: 'decade', div: 315567360},
{name: 'year', div: 31556736},
{name: 'month', div: 2629728},
{name: 'day', div: 86400},
{name: 'hour', div: 3600},
{name: 'minute', div: 60},
{name: 'second', div: 1}
];
function timeAgoNaive2(comparisonDate) {
var i = 0,
parts = [],
interval = Math.floor((new Date().getTime() - comparisonDate.getTime()) / 1000);
for ( ; interval > 0; i += 1) {
var value = Math.floor(interval / timeparts[i].div);
interval = interval - (value * timeparts[i].div);
if (value) {
parts.push(value + ' ' + timeparts[i].name + (value !== 1 ? timeparts[i].p || 's' : timeparts[i].s || ''));
}
}
if (parts.length === 0) { return 'now'; }
return parts.join(', ') + ' ago';
}
console.log(timeAgoNaive2(new Date(Date.parse('Jun 12 2006 11:52:33'))));
console.log(timeAgoNaive2(new Date(new Date().getTime() - 3600000)));
console.log(timeAgoNaive2(new Date()));
console.log(timeAgoNaive2(new Date(-92709631247000)));
输出:
6 years, 1 month, 1 day, 10 hours, 53 minutes, 44 seconds ago
1 hour ago
now
2 millennia, 9 centuries, 8 decades, 4 months, 26 days, 22 hours, 41 minutes, 47 seconds ago
它仍然很天真,但它做得更好。此外,它适用于像不列颠哥伦比亚省这样的非常古老的日期。:)
更改逻辑,使其不只是找到一个最大的度量单位,而是对余数进行处理。
基本上,你需要做的是从最大的增量开始,找到值,然后从总数中减去它,得到余数。然后重复。
也许是这样,我还没有测试过。
var elapsed = current - previous;
var remainder = elapsed;
int years;
int months;
years = Math.floor(remainder/msPerYear);
remainder = remainder % msPerYear;
months = Math.floor(remainder/msPerMonth);
remainder = remainder % msPerMonth;
// repeat
然后根据变量构建字符串。
这应该可以做到:
var msPerMinute = 60 * 1000;
var msPerHour = msPerMinute * 60;
var msPerDay = msPerHour * 24;
var msPerMonth = msPerDay * 30;
var msPerYear = msPerDay * 365;
function timeDifference(current, previous) {
var remainder = current - previous;
var message = "";
var sep = "";
var years = Math.floor(remainder/msPerYear);
remainder = remainder - years * msPerYear;
if (years > 0) {
message += years + " years";
sep = ", ";
console.log(message);
}
var months = Math.floor(remainder/msPerMonth);
remainder = remainder - months * msPerMonth;
if (months > 0) {
message += sep + months + " months";
sep = ", ";
console.log(message);
}
var days = Math.floor(remainder/msPerDay);
remainder = remainder - days * msPerDay;
if (days > 0) {
message += sep + days + " days";
sep = ", ";
console.log(message);
}
var hours = Math.floor(remainder/msPerHour);
remainder = remainder - hours * msPerHour;
if (hours > 0) {
message += sep + hours + " hours";
sep = ", ";
console.log(message);
}
var minutes = Math.floor(remainder/msPerMinute);
remainder = remainder - minutes * msPerMinute;
if (months > 0) {
message += sep + minutes + " minutes";
sep = ", ";
console.log(message);
}
var seconds = Math.floor(remainder/1000);
remainder = remainder - seconds * 1000;
if (months > 0) {
message += sep + seconds + " seconds";
sep = ", ";
console.log(message);
}
message += " ago";
var pos = message.lastIndexOf(',');
message = message.substring(0,pos) + ' and' + message.substring(pos+1)
return message;
};
var output = timeDifference(new Date(2012, 10, 20, 12, 0, 59), new Date(2012, 2, 13, 10, 15, 12));
console.log(output);
输出:前8个月12天1小时45分47秒
当然,可以对其进行重构,以减少重复性。你可以试试这把小提琴,让它发挥作用:http://jsfiddle.net/vawEf/
- 如何每10.6秒从时间戳增加+1
- 在控制器中将输入类型时间更改为秒
- 我需要在每5秒内调用一个函数,并重置持续时间
- 如何在特定时间重新加载page.php,例如:07:45.非持续时间,例如:每5秒
- 计算JavaScript中的时间差异(天+小时+分钟+秒)
- 如何使用moment.js将秒转换为时间格式(YYYY:MM:DD HH:MM:ss)
- 如果页面加载时间超过 10 秒,如何刷新页面
- 在 javascript 中将 24 小时时间转换为 12 小时,运行秒数
- 如何使用 Javascript 将持续时间字符串解析为秒
- 几年前的javascript时间戳,并考虑闰年
- 在条件中的几个时间行中设置自定义css效果后,从Jquery时间选择器显示时间
- 淡入淡出每隔几秒就会发生变化的图像
- Javascript/jQuery使用正则表达式搜索“分钟:秒”时间
- 节点 - MySQL 查询,需要几分钟时间,在几分钟后重复自己,然后完成原始查询
- HTML5 -视频播放时每隔几秒触发一次事件
- 使用JavaScript在视频结束前几秒运行一个函数
- 反应-每隔几秒渲染相对时间
- 显示前的几秒延迟:无
- 使用socket.io每隔几秒以编程方式触发一个事件
- 在每隔几秒播放的动画中添加声音