// 数字补零
const formatNumber = num => `${num > 9 ? "" : "0"}${num}`;
/**
* 转换 Date 对象
* @param {Date} date
* @returns {Object}
*/
function standardizedDate(date) {
const year = date.getFullYear();
const month = date.getMonth() + 1;
const day = date.getDate();
const hour = date.getHours();
const minute = date.getMinutes();
return {
year,
month: formatNumber(month),
day: formatNumber(day),
hour: formatNumber(hour),
minute: formatNumber(minute)
};
}
/**
* 格式化 Date 对象为相应时间字符串
* @param {Date} date
* @param {String} type
* @returns {String}
*/
function formatTime(date, type) {
let currentYear = new Date().getFullYear();
let stdDate = standardizedDate(date);
let result;
switch (type) {
case "short":
result = stdDate.hour + ":" + stdDate.minute;
break;
case "withNoYear":
result =
stdDate.month +
"-" +
stdDate.day +
" " +
stdDate.hour +
":" +
stdDate.minute;
if (stdDate.year != currentYear) {
result = stdDate.year + "-" + result;
}
break;
case "y-m-d":
result = stdDate.year + "-" + stdDate.month + "-" + stdDate.day;
break;
case "full":
result =
stdDate.year +
"-" +
stdDate.month +
"-" +
stdDate.day +
" " +
stdDate.hour +
":" +
stdDate.minute;
break;
default:
result = "";
}
return result;
}
/**
* 获取距离当前时间的时间长度
* @param {Number} timestamp
* @returns {String}
*/
function limeTime(timestamp) {
let currentUnixTime = Math.round(new Date().getTime() / 1000);
let deltaSecond = currentUnixTime - parseInt(timestamp, 10);
let result;
if (deltaSecond < 60) {
result = deltaSecond + " 秒前";
} else if (deltaSecond < 3600) {
result = Math.floor(deltaSecond / 60) + " 分钟前";
} else if (deltaSecond < 86400) {
result = Math.floor(deltaSecond / 3600) + " 小时前";
} else {
result = Math.floor(deltaSecond / 86400) + " 天前";
}
return result;
}
/**
* 时间戳转化为年 月 日 时 分 秒
* number: 传入时间戳
* format:返回格式,支持自定义,但参数必须与formateArr里保持一致
* 例子:formatDate(时间戳, 'M月D日 h:m:s')
*/
export const formatDate = (number, format) => {
const formateArr = ["Y", "M", "D", "h", "m", "s", "年", "月", "日"];
let returnArr = [];
const date = new Date(number * 1000);
returnArr.push(date.getFullYear());
returnArr.push(formatNumber(date.getMonth() + 1));
returnArr.push(formatNumber(date.getDate()));
returnArr.push(formatNumber(date.getHours()));
returnArr.push(formatNumber(date.getMinutes()));
returnArr.push(formatNumber(date.getSeconds()));
for (let i in returnArr) {
format = format.replace(formateArr[i], returnArr[i]);
}
return format;
};
/** 获取当前 Unix 时间戳
* 获取当前时间戳
* @returns {Number}
*/
export const getUnix = () => {
return Math.round(+new Date() / 1000);
};
/**
* 时间格式转时间戳
*/
export const timestamp = data => {
// var stringTime = "2014-07-10 10:21:12";
let timestamp2 = Date.parse(new Date(data));
timestamp2 = timestamp2 / 1000;
//2014-07-10 10:21:12的时间戳为:1404958872
return timestamp2;
};
// 秒转时间
export const waitTimer = array => {
if (!Array.isArray(array)) {
throw new TypeError("array必须为数组");
}
return array.map(item => {
let rest = item;
const _hours = Math.floor(rest / 3600);
const hours = formatNumber(_hours);
rest = rest - _hours * 3600;
const _minutes = Math.floor(rest / 60);
const minutes = formatNumber(_minutes);
rest = rest - _minutes * 60;
const seconds = formatNumber(rest);
return `${hours}:${minutes}:${seconds}`;
});
};
/**
* 判断是否为当天时间
* @param {Number} str
*/
export const isToday = str => {
const time = String(str).length === 10 ? str * 1000 : str;
if (new Date(time).toDateString() === new Date().toDateString()) {
return true;
} else if (new Date(str) < new Date()) {
return false;
}
};
/**
* 根据跟当前时间的时间长度返回中文时间字符串
* @param {Date} date
* @returns {String}
*/
export const dateToRelativeTime = date => {
let DaySeconds = 86400; // const letiable, 24 hours * 60 mins * 60 s
let currentDate = new Date();
let currentMonth = currentDate.getMonth();
let currentYear = currentDate.getFullYear();
date = new Date(date);
let year = date.getFullYear();
let month = date.getMonth();
let days = new Date().getDate() - date.getDate();
let distanceMillis = currentDate.getTime() - date.getTime();
let seconds = Math.floor(Math.abs(distanceMillis) / 1000);
let minutes = Math.floor(seconds / 60);
let result;
// more than whole day
if (seconds >= DaySeconds) {
if (days == 1 && seconds < DaySeconds * 2) {
result = "昨天 " + formatTime(date, "short");
} else if (days == 2 && seconds < DaySeconds * 3) {
result = "前天 " + formatTime(date, "short");
} else if (year === currentYear) {
result = formatTime(date, "withNoYear");
} else {
result = formatTime(date, "full");
}
}
// more than one day but no whole day or in different month e.g. May or June,but days != 1 .
else if (days == 1 || currentMonth != month) {
result = limeTime(date.getTime() / 1000);
} else if (seconds >= 3600) {
result = limeTime(date.getTime() / 1000);
} else if (seconds >= 60) {
result = minutes + " 分钟前";
} else {
result = "刚刚";
}
return result;
};
/**
* 获取给定日期的前一个星期的日期字对象
* @param {Date} nowDate
* @returns {Object}
*/
export const getWeekDate = (nowDate = new Date()) => {
let lastWeekStamp = nowDate.getTime() - 6 * 3600 * 24 * 1000;
let lastWeekDate = new Date();
lastWeekDate.setTime(lastWeekStamp);
let stdNowDate = standardizedDate(nowDate);
let stdLastWeekDate = standardizedDate(lastWeekDate);
return {
nowTime: stdNowDate.year + "-" + stdNowDate.month + "-" + stdNowDate.day,
pastTime:
stdLastWeekDate.year +
"-" +
stdLastWeekDate.month +
"-" +
stdLastWeekDate.day
};
};