gpt4 book ai didi

精确到秒的 Javascript 模糊时间(例如 '10 minutes ago')

转载 作者:数据小太阳 更新时间:2023-10-29 03:50:04 26 4
gpt4 key购买 nike

我正在制作一个计算“秒前”的 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 是“秒前”格式。 interval 循环遍历一堆时间戳元素,并为每个时间戳选择正确的一个。然后它在时间上加一秒,将其转换回“模糊时间”(秒前),用新时间替换 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 年,0 个月,0 天,0 小时,0 分钟” , 0 秒前”。但它不会通过扩展您提供的函数中的逻辑来做到这一点,它也不会在我的函数中这样做(加上我的函数不会使用几个月)。比 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

它仍然很幼稚,但它做得更好一些。此外,它适用于像 B.C. 这样的真正古老的日期。那些。 :)

关于精确到秒的 Javascript 模糊时间(例如 '10 minutes ago'),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11479170/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com