114 lines
2.9 KiB
JavaScript
114 lines
2.9 KiB
JavaScript
// Credit: https://github.com/github/time-elements/
|
|
const weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
|
|
const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
|
|
|
|
const pad = num => `0${num}`.slice(-2);
|
|
|
|
function strftime(time, formatString) {
|
|
const day = time.getDay();
|
|
const date = time.getDate();
|
|
const month = time.getMonth();
|
|
const year = time.getFullYear();
|
|
const hour = time.getHours();
|
|
const minute = time.getMinutes();
|
|
const second = time.getSeconds();
|
|
return formatString.replace(/%([%aAbBcdeHIlmMpPSwyYZz])/g, (_arg) => {
|
|
let match;
|
|
const modifier = _arg[1];
|
|
switch (modifier) {
|
|
case '%':
|
|
default:
|
|
return '%';
|
|
case 'a':
|
|
return weekdays[day].slice(0, 3);
|
|
case 'A':
|
|
return weekdays[day];
|
|
case 'b':
|
|
return months[month].slice(0, 3);
|
|
case 'B':
|
|
return months[month];
|
|
case 'c':
|
|
return time.toString();
|
|
case 'd':
|
|
return pad(date);
|
|
case 'e':
|
|
return date;
|
|
case 'H':
|
|
return pad(hour);
|
|
case 'I':
|
|
return pad(strftime(time, '%l'));
|
|
case 'l':
|
|
return hour === 0 || hour === 12 ? 12 : (hour + 12) % 12;
|
|
case 'm':
|
|
return pad(month + 1);
|
|
case 'M':
|
|
return pad(minute);
|
|
case 'p':
|
|
return hour > 11 ? 'PM' : 'AM';
|
|
case 'P':
|
|
return hour > 11 ? 'pm' : 'am';
|
|
case 'S':
|
|
return pad(second);
|
|
case 'w':
|
|
return day;
|
|
case 'y':
|
|
return pad(year % 100);
|
|
case 'Y':
|
|
return year;
|
|
case 'Z':
|
|
match = time.toString().match(/\((\w+)\)$/);
|
|
return match ? match[1] : '';
|
|
case 'z':
|
|
match = time.toString().match(/\w([+-]\d\d\d\d) /);
|
|
return match ? match[1] : '';
|
|
}
|
|
});
|
|
}
|
|
|
|
class RelativeTime {
|
|
constructor(date) {
|
|
this.date = date;
|
|
}
|
|
|
|
toString() {
|
|
const ago = this.timeElapsed();
|
|
return ago || `${this.formatDate()}`;
|
|
}
|
|
|
|
timeElapsed() {
|
|
const ms = new Date().getTime() - this.date.getTime();
|
|
const sec = Math.round(ms / 1000);
|
|
const min = Math.round(sec / 60);
|
|
const hr = Math.round(min / 60);
|
|
const day = Math.round(hr / 24);
|
|
if (ms < 0) {
|
|
return '刚刚';
|
|
} else if (sec < 45) {
|
|
return '刚刚';
|
|
} else if (sec < 90) {
|
|
return '1分钟前';
|
|
} else if (min < 45) {
|
|
return `${min}分钟前`;
|
|
} else if (min < 90) {
|
|
return '1小时前';
|
|
} else if (hr < 24) {
|
|
return `${hr}小时前`;
|
|
} else if (hr < 36) {
|
|
return '1天前';
|
|
} else if (day < 30) {
|
|
return `${day}天前`;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
formatDate() {
|
|
return strftime(this.date, '%Y-%m-%d');
|
|
}
|
|
}
|
|
|
|
export default {
|
|
format(time) {
|
|
return time && new RelativeTime(new Date(time)).toString();
|
|
},
|
|
};
|