日期时间相关

日期格式化

export function formatDate(
  dat: Date,
  formatString = 'yyyy-MM-dd hh:mm:ss',
): string {
  let str = formatString;
  const year = `${dat.getFullYear()}`;
  const month = `${dat.getMonth() + 1}`.padStart(2, '0');
  const day = `${dat.getDate()}`.padStart(2, '0');
  const hour = `${dat.getHours()}`.padStart(2, '0');
  const minutes = `${dat.getMinutes()}`.padStart(2, '0');
  const seconds = `${dat.getSeconds()}`.padStart(2, '0');
  str = str.replace(/yyyy/i, year);
  str = str.replace(/MM/, month);
  str = str.replace(/dd/i, day);
  str = str.replace(/hh/i, hour);
  str = str.replace(/mm/, minutes);
  str = str.replace(/ss/i, seconds);
  return str;
}

日期加一天 减一天

var date = new Date();
console.log(date) // Thu Dec 06 2018 14:58:22 GMT+0800 (中国标准时间)
date = date.setDate(date.getDate()+1);
date = new Date(date);
console.log(date) // Fri Dec 07 2018 14:58:22 GMT+0800 (中国标准时间)

日期转换为yy-mm-ss hh:mm:ss

Date对象的toLocaleString([locales][, options])

  • locales: 区域设置标记。标记可包括语言、区域、国家/地区和变量。
  • options: 参数可包括以下属性:
    • hour12: 接受一个布尔值, 指定是否对小时使用 12 小时格式,false为24小时格式。详情请查看

示例:

/*格式化日期格式
 *@param {String} strTime 接受一个毫秒数作为参数
 *@return {String} 返回yy-mm-ss  hh:mm:ss格式
*/
function dateFormat(strTime){
  var date = new Date(Number(strTime))
  return date.toLocaleString('zh-CN',{hour12:false})
         .replace(/\b\d\b/g,'0$&').replace(/\//g,'-')
}

// input: 1544079025783
// output: "2018-12-06 14:50:25"

获取指定时区的时间

function formatDatePicker(num){
  //目标时区 东八区传入数字8
  var timezone = num;
  // 本地时间和格林威治的时间差,单位为分钟,转换为毫秒
  var offset = new Date().getTimezoneOffset()* 60 * 1000;
  // 本地时间距格林威治时间之间的毫秒数
  var timestamp = new Date().getTime();
  return new Date(timestamp + offset  + timezone * 60 * 60 * 1000).getTime();
  // timestamp + offset  
  // 相当于是当前utc的时间即世界时(0时区的时间),再加上1时区相隔1小时 得到指定时区的当前时间。 
}

处理距离当前时间的间隔

“刚刚” “几分钟前” “几小时前” …

const getTimeShow = timeStr => {
  if (tmpStr && typeof tmpStr === 'string') {
    tmpStr = tmpStr.replace(/\-/g, '/'); // 兼容 ios
  } else {
    return '--';
  }

  const date = new Date(tmpStr); 

  if (date == 'Invalid Date') {
    return '--';
  }

  const now = new Date();

  // 计算时间间隔,单位为分钟
  const inter = parseInt((now.getTime() - date.getTime()) / 1000 / 60, 0);
  if (inter < 10) {
    return '刚刚';
  }

  // 多少分钟前
  if (inter < 60) {
    return `${inter.toString()}分钟前`;
  }

  // 多少小时前
  if (inter < 60 * 24) {
    const hour = parseInt(inter / 60);
    return `${hour}小时前`;
  }

  const month = `${date.getMonth() + 1}`.padStart(2, '0');
  const day = `${date.getDate()}`.padStart(2, '0');

  // 本年度内,展示 月-日
  if (now.getFullYear() === date.getFullYear()) {
    return `${month}-${day}`;
  }

  // 不是本年度 展示 年-月-日 
  return `${date.getFullYear().toString()}-${month}-${day}`;
};

export default getTimeShow;

时间格式Reg => yyyy-MM-dd HH:mm:ss

var _reTimeReg = /^(?:19|20)[0-9][0-9]-(?:(?:0[1-9])|(?:1[0-2]))-(?:(?:[0-2][1-9])|(?:[1-3][0-1])) (?:(?:[0-2][0-3])|(?:[0-1][0-9])):[0-5][0-9]:[0-5][0-9]$/;

new Date() 在移动端的兼容问题

// 1. 日期 在安卓和ios上都表现正常
var d1 = new Date('2020-01-01');
// 2. 日期 在安卓和ios上都表现正常
var d2 = new Date('2020/01/01');

// 3. 日期+时间 在ios不兼容 在安卓上兼容
var d1 = new Date('2020-01-01 08:00:00');

// 4. 日期+时间 第二种 兼容ios 和 安卓
var d2 = new Date('2020/01/01 08:00:00');

// 解决方案
var timeStr = '2020-02-02 12:00:00'
var date = new Date(timeStr.replace(/\-/g, '/'))