问题是如何将 JavaScript 格式化Date
为字符串,说明所用的时间类似于您在 Stack Overflow 上看到的时间显示方式。
例如
- 1 分钟前
- 1小时前
- 1天前
- 1个月前
- 1年前
问题是如何将 JavaScript 格式化Date
为字符串,说明所用的时间类似于您在 Stack Overflow 上看到的时间显示方式。
例如
function timeSince(date) {
var seconds = Math.floor((new Date() - date) / 1000);
var interval = seconds / 31536000;
if (interval > 1) {
return Math.floor(interval) + " years";
}
interval = seconds / 2592000;
if (interval > 1) {
return Math.floor(interval) + " months";
}
interval = seconds / 86400;
if (interval > 1) {
return Math.floor(interval) + " days";
}
interval = seconds / 3600;
if (interval > 1) {
return Math.floor(interval) + " hours";
}
interval = seconds / 60;
if (interval > 1) {
return Math.floor(interval) + " minutes";
}
return Math.floor(seconds) + " seconds";
}
var aDay = 24*60*60*1000;
console.log(timeSince(new Date(Date.now()-aDay)));
console.log(timeSince(new Date(Date.now()-aDay*2)));
在这种情况下可能有点矫枉过正,但如果机会表明moment.js真是太棒了!
Moment.js 是一个 javascript 日期时间库,要将它用于这种情况,您需要执行以下操作:
moment(yourdate).fromNow()
http://momentjs.com/docs/#/displaying/fromnow/
2018 年附录:Luxon是一个新的现代图书馆,值得一看!
这将向您显示过去和以前的时间格式,例如“2 天前”“从现在起 10 分钟”,您可以将它传递给 Date 对象、数字时间戳或日期字符串
function time_ago(time) {
switch (typeof time) {
case 'number':
break;
case 'string':
time = +new Date(time);
break;
case 'object':
if (time.constructor === Date) time = time.getTime();
break;
default:
time = +new Date();
}
var time_formats = [
[60, 'seconds', 1], // 60
[120, '1 minute ago', '1 minute from now'], // 60*2
[3600, 'minutes', 60], // 60*60, 60
[7200, '1 hour ago', '1 hour from now'], // 60*60*2
[86400, 'hours', 3600], // 60*60*24, 60*60
[172800, 'Yesterday', 'Tomorrow'], // 60*60*24*2
[604800, 'days', 86400], // 60*60*24*7, 60*60*24
[1209600, 'Last week', 'Next week'], // 60*60*24*7*4*2
[2419200, 'weeks', 604800], // 60*60*24*7*4, 60*60*24*7
[4838400, 'Last month', 'Next month'], // 60*60*24*7*4*2
[29030400, 'months', 2419200], // 60*60*24*7*4*12, 60*60*24*7*4
[58060800, 'Last year', 'Next year'], // 60*60*24*7*4*12*2
[2903040000, 'years', 29030400], // 60*60*24*7*4*12*100, 60*60*24*7*4*12
[5806080000, 'Last century', 'Next century'], // 60*60*24*7*4*12*100*2
[58060800000, 'centuries', 2903040000] // 60*60*24*7*4*12*100*20, 60*60*24*7*4*12*100
];
var seconds = (+new Date() - time) / 1000,
token = 'ago',
list_choice = 1;
if (seconds == 0) {
return 'Just now'
}
if (seconds < 0) {
seconds = Math.abs(seconds);
token = 'from now';
list_choice = 2;
}
var i = 0,
format;
while (format = time_formats[i++])
if (seconds < format[0]) {
if (typeof format[2] == 'string')
return format[list_choice];
else
return Math.floor(seconds / format[2]) + ' ' + format[1] + ' ' + token;
}
return time;
}
var aDay = 24 * 60 * 60 * 1000;
console.log(time_ago(new Date(Date.now() - aDay)));
console.log(time_ago(new Date(Date.now() - aDay * 2)));
我没有检查过(虽然不难),但我认为Stack Exchange 站点使用该jquery.timeago
插件来创建这些时间字符串。
该插件使用起来非常简单,而且很干净并且会自动更新。
这是一个快速示例(来自插件的主页):
首先,加载 jQuery 和插件:
<script src="jquery.min.js" type="text/javascript"></script> <script src="jquery.timeago.js" type="text/javascript"></script>
现在,让我们将它附加到 DOM 上的时间戳上:
jQuery(document).ready(function() {
jQuery("abbr.timeago").timeago(); });这会将标题中
abbr
具有类timeago
和 ISO 8601 时间戳的所有元素:<abbr class="timeago" title="2008-07-17T09:24:17Z">July 17, 2008</abbr>
变成这样的:<abbr class="timeago" title="July 17, 2008">about a year ago</abbr>
产生:大约一年前。随着时间的推移,时间戳会自动更新。
这是对 Sky Sander 解决方案的轻微修改,它允许将日期作为字符串输入,并且能够显示“1 分钟”而不是“73 秒”等跨度
var timeSince = function(date) {
if (typeof date !== 'object') {
date = new Date(date);
}
var seconds = Math.floor((new Date() - date) / 1000);
var intervalType;
var interval = Math.floor(seconds / 31536000);
if (interval >= 1) {
intervalType = 'year';
} else {
interval = Math.floor(seconds / 2592000);
if (interval >= 1) {
intervalType = 'month';
} else {
interval = Math.floor(seconds / 86400);
if (interval >= 1) {
intervalType = 'day';
} else {
interval = Math.floor(seconds / 3600);
if (interval >= 1) {
intervalType = "hour";
} else {
interval = Math.floor(seconds / 60);
if (interval >= 1) {
intervalType = "minute";
} else {
interval = seconds;
intervalType = "second";
}
}
}
}
}
if (interval > 1 || interval === 0) {
intervalType += 's';
}
return interval + ' ' + intervalType;
};
var aDay = 24 * 60 * 60 * 1000;
console.log(timeSince(new Date(Date.now() - aDay)));
console.log(timeSince(new Date(Date.now() - aDay * 2)));