js 时间常用方法

//  数字补零
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
  };
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值