123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
-
-
- export const MILLISECONDS_A_SECOND = 1e3
- export const MILLISECONDS_A_MINUTE = 60 * MILLISECONDS_A_SECOND
- export const MILLISECONDS_A_HOUR = 60 * MILLISECONDS_A_MINUTE
- export const MILLISECONDS_A_DAY = 24 * MILLISECONDS_A_HOUR
-
- export const diff = (dt1, dt2) => {
- if (!dt1 || !dt2) return [];
-
- const bw = new Date(dt1) - new Date(dt2)
- const day = Math.floor(bw / MILLISECONDS_A_DAY)
- const hour = Math.floor(bw % MILLISECONDS_A_DAY / MILLISECONDS_A_HOUR)
- const min = Math.floor(bw % MILLISECONDS_A_DAY % MILLISECONDS_A_HOUR / MILLISECONDS_A_MINUTE)
- const sec = Math.floor(bw % MILLISECONDS_A_DAY % MILLISECONDS_A_HOUR % MILLISECONDS_A_MINUTE / MILLISECONDS_A_SECOND)
- return [bw, day, hour, min, sec]
- }
-
- //例子 getDateFormat(new Date().valueOf(),true,'yyyy/M/d')
- export function formatDate(dt, fmt) {
- const date = new Date(dt)
-
- var o = {
- "M+": date.getMonth() + 1, //月份
- "d+": date.getDate(), //日
- "h+": date.getHours(), //小时
- "m+": date.getMinutes(), //分
- "s+": date.getSeconds(), //秒
- "q+": Math.floor((date.getMonth() + 3) / 3), //季度
- "S": date.getMilliseconds() //毫秒
- };
- if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
- for (var k in o)
- if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
- return fmt;
- };
-
-
- /**
- * 仿照微信中的消息时间显示逻辑,将时间戳(单位:毫秒)转换为友好的显示格式.
- *
- * 1)7天之内的日期显示逻辑是:今天、昨天(-1d)、前天(-2d)、星期?(只显示总计7天之内的星期数,即<=-4d);
- * 2)7天之外(即>7天)的逻辑:直接显示完整日期时间。
- *
- * @param {[string|date]} dt 时间
- * @param {boolean} mustIncludeTime true表示输出的格式里一定会包含“时间:分钟”
- * ,否则不包含(参考微信,不包含时分的情况,用于首页“消息”中显示时)
- *
- * @return {string} 输出格式形如:“刚刚”、“10:30”、“昨天 12:04”、“前天 20:51”、“星期二”、“2019/2/21 12:09”等形式
- * @since 1.1
- */
- export function getDateForHumans(dt, mustIncludeTime, format='yyyy-M-d') {
-
- // 当前时间
- var currentDate = new Date();
- // 目标判断时间
- var srcDate = new Date(dt);
-
- var currentYear = currentDate.getFullYear();
- var currentMonth = (currentDate.getMonth() + 1);
- var currentDateD = currentDate.getDate();
-
- var srcYear = srcDate.getFullYear();
- var srcMonth = (srcDate.getMonth() + 1);
- var srcDateD = srcDate.getDate();
-
- var ret = "";
-
- // 要额外显示的时间分钟
- var timeExtraStr = (mustIncludeTime ? " " + formatDate(srcDate, "hh:mm") : "");
-
- // 当年
- if (currentYear == srcYear) {
- // 相差时间(单位:毫秒)
- var deltaTime = (currentDate - srcDate);
-
- // 当天(月份和日期一致才是)
- if (currentMonth == srcMonth && currentDateD == srcDateD) {
- // 时间相差60秒以内
- if (deltaTime < 60 * 1000)
- ret = "刚刚";
- // 否则当天其它时间段的,直接显示“时:分”的形式
- else
- ret = formatDate(srcDate, "hh:mm");
- }
- // 当年 && 当天之外的时间(即昨天及以前的时间)
- else {
- // 昨天(以“现在”的时候为基准-1天)
- var yesterdayDate = new Date();
- yesterdayDate.setDate(yesterdayDate.getDate() - 1);
-
- // 前天(以“现在”的时候为基准-2天)
- var beforeYesterdayDate = new Date();
- beforeYesterdayDate.setDate(beforeYesterdayDate.getDate() - 2);
-
- // 用目标日期的“月”和“天”跟上方计算出来的“昨天”进行比较,是最为准确的(如果用时间戳差值
- // 的形式,是不准确的,比如:现在时刻是2019年02月22日1:00、而srcDate是2019年02月21日23:00,
- // 这两者间只相差2小时,直接用“deltaTime/(3600 * 1000)” > 24小时来判断是否昨天,就完全是扯蛋的逻辑了)
- if (srcMonth == (yesterdayDate.getMonth() + 1) && srcDateD == yesterdayDate.getDate())
- ret = "昨天" + timeExtraStr;// -1d
- // “前天”判断逻辑同上
- else if (srcMonth == (beforeYesterdayDate.getMonth() + 1) && srcDateD == beforeYesterdayDate.getDate())
- ret = "前天" + timeExtraStr;// -2d
- else {
- // 跟当前时间相差的小时数
- var deltaHour = (deltaTime / (3600 * 1000));
-
- // 如果小于或等 7*24小时就显示星期几
- if (deltaHour <= 7 * 24) {
- var weekday = new Array(7);
- weekday[0] = "星期日";
- weekday[1] = "星期一";
- weekday[2] = "星期二";
- weekday[3] = "星期三";
- weekday[4] = "星期四";
- weekday[5] = "星期五";
- weekday[6] = "星期六";
-
- // 取出当前是星期几
- var weedayDesc = weekday[srcDate.getDay()];
- ret = weedayDesc + timeExtraStr;
- }
- // 否则直接显示完整日期时间
- else
- ret = formatDate(srcDate, format) + timeExtraStr;
- }
- }
- }
- // 往年
- else {
- ret = formatDate(srcDate, format) + timeExtraStr;
- }
- return ret;
- };
|