JS日期格式封装,包含format格式,计算前几天、后几天、计算当前周,周一为本周第一天、计算当前为这一年的第几周、格式化日期为友好的“相对时间”

144 阅读2分钟

dayjs使用:

官网地址:Day.js中文网,可查阅文档使用更多api

自定义日期封装:

1.根据给定时间,返回年月日时分秒相应格式

// 根据给定时间,返回年月日时分秒相应格式
function formatDate(date, format = "YYYY-MM-DD") {
  const pad = (num) => String(num).padStart(2, "0");
  return format
    .replace("YYYY", date.getFullYear())
    .replace("MM", pad(date.getMonth() + 1)) // getMonth() 返回的月份是从 0 开始的
    .replace("DD", pad(date.getDate()))
    .replace("HH", pad(date.getHours()))
    .replace("mm", pad(date.getMinutes()))
    .replace("ss", pad(date.getSeconds()));
}
// 使用示例
const formattedDate = formatDate(new Date(), "YYYY/MM/DD HH:mm:ss");

2.如需要计算几天前,几天后,可传入daysOffset,daysOffset为正负值,代表前几天,后几天,传入0则代表今日

// 如需要计算几天前,几天后,可传入daysOffset
// daysOffset为正负值,代表前几天,后几天,传入0则代表今日
function formatDateDay(date, daysOffset, format = "YYYY-MM-DD") {
  const pad = (num) => String(num).padStart(2, "0");
  date.setDate(date.getDate() + daysOffset);
  return format
    .replace("YYYY", date.getFullYear())
    .replace("MM", pad(date.getMonth() + 1)) // getMonth() 返回的月份是从 0 开始的
    .replace("DD", pad(date.getDate()))
    .replace("HH", pad(date.getHours()))
    .replace("mm", pad(date.getMinutes()))
    .replace("ss", pad(date.getSeconds()));
}
// 使用示例
const formattedDateDay = formatDateDay(new Date(), 1, "YYYY/MM/DD HH:mm:ss");

3. 计算当前周为这一年的第几周

function getWeekNumber(date) {
  const jan1 = new Date(date.getFullYear(), 0, 1);
  const dayNum = Math.floor((date - jan1) / 86400000); // 距离当年开始的毫秒数转换成天数
  const week1 = Math.floor((dayNum + jan1.getDay() - 1) / 7) + 1;
  return week1;
}
// 使用示例
const weekNumber = getWeekNumber(new Date());

4.格式化日期为友好的“相对时间”

// 格式化日期为友好的“相对时间”
function formatDateRelative(dateString) {
  const now = new Date();
  const pastDate = new Date(dateString);
  const secondsPerMinute = 60;
  const minutesPerHour = 60;
  const hoursPerDay = 24;
  const millisecondsPerSecond = 1000;
  const delta = Math.abs(pastDate - now);
  const seconds = Math.floor(delta / millisecondsPerSecond);
  const minutes = Math.floor(seconds / secondsPerMinute);
  const hours = Math.floor(minutes / minutesPerHour);
  const days = Math.floor(hours / hoursPerDay);
  if (seconds < 1 * secondsPerMinute) {
    return seconds === 0 ? "刚刚" : `${seconds}秒前`;
  }
  if (seconds < 2 * secondsPerMinute) {
    return "1分钟前";
  }
  if (minutes < 1 * minutesPerHour) {
    return `${minutes}分钟前`;
  }
  if (hours < 1 * hoursPerDay) {
    return `${hours}小时前`;
  }
  if (days < 1) {
    return `${hours}小时前`; // 修正:如果小于一天,使用小时计算
  }
  return `${Math.floor(days)}天前`;
}
// 使用示例
const relativeTime = formatDateRelative("2024-05-22 16:47:00");

5. 该函数需要使用到formatDate方法(本文第一点,日期封装),计算给定时间一周内日期和星期

const nextWeekDates = function (time) {
  const nextWeek = [];
  // 获取给定日期是星期几
  const weekdays = [
    "周日",
    "周一",
    "周二",
    "周三",
    "周四",
    "周五",
    "周六",
  ];
  const weekday = weekdays[time.getDay()];
 
  // 计算这一周或上一周的日期和星期
  const currentDate = new Date(time.getTime());
  currentDate.setDate(currentDate.getDate() - currentDate.getDay() + 1);
 
  if (weekday === "周日") {
    currentDate.setDate(currentDate.getDate() - 7);
  }
  for (let i = 0; i < 7; i++) {
    const date = new Date(
      currentDate.getTime() + i * 24 * 60 * 60 * 1000
    );
    const stamp = formatDate(date, "YYYY/MM/DD");
    let stampSen = null;
    if (i !== 6) {
      stampSen = formatDate(date, "YYYY/MM/DD") + " 00:00:00";
    } else {
      stampSen = formatDate(date, "YYYY/MM/DD") + " 23:59:59";
    }
    const month = date.getMonth() + 1;
    const day = date.getDate();
    const dateString = `${month}/${day}`;
    const weekday = weekdays[date.getDay()];
    const dayDate = date;
    nextWeek.push({
      stamp: stamp,
      date: dateString,
      weekday,
      dateTime: dayDate,
      stampSen: stampSen,
    });
  }
  return nextWeek;
};

返回格式截图,可以拿到给定日期一周内的所有需要的数据

image.png

6.工作中可直接复制以下代码使用,为上面所有封装合计代码

// 根据给定时间,返回年月日时分秒相应格式
function formatDate(date, format = "YYYY-MM-DD") {
  const pad = (num) => String(num).padStart(2, "0");
  return format
    .replace("YYYY", date.getFullYear())
    .replace("MM", pad(date.getMonth() + 1)) // getMonth() 返回的月份是从 0 开始的
    .replace("DD", pad(date.getDate()))
    .replace("HH", pad(date.getHours()))
    .replace("mm", pad(date.getMinutes()))
    .replace("ss", pad(date.getSeconds()));
}
// 使用示例
const formattedDate = formatDate(new Date(), "YYYY/MM/DD HH:mm:ss");
 
// 如需要计算几天前,几天后,可传入daysOffset
// daysOffset为正负值,代表前几天,后几天,传入0则代表今日
function formatDateDay(date, daysOffset, format = "YYYY-MM-DD") {
  const pad = (num) => String(num).padStart(2, "0");
  date.setDate(date.getDate() + daysOffset);
  return format
    .replace("YYYY", date.getFullYear())
    .replace("MM", pad(date.getMonth() + 1)) // getMonth() 返回的月份是从 0 开始的
    .replace("DD", pad(date.getDate()))
    .replace("HH", pad(date.getHours()))
    .replace("mm", pad(date.getMinutes()))
    .replace("ss", pad(date.getSeconds()));
}
// 使用示例
const formattedDateDay = formatDateDay(new Date(), 1, "YYYY/MM/DD HH:mm:ss");
 
// 计算当前为这一年的第几周
function getWeekNumber(date) {
  const jan1 = new Date(date.getFullYear(), 0, 1);
  const dayNum = Math.floor((date - jan1) / 86400000); // 距离当年开始的毫秒数转换成天数
  const week1 = Math.floor((dayNum + jan1.getDay() - 1) / 7) + 1;
  return week1;
}
// 使用示例
const weekNumber = getWeekNumber(new Date());
 
// 格式化日期为友好的“相对时间”
function formatDateRelative(dateString) {
  const now = new Date();
  const pastDate = new Date(dateString);
  const secondsPerMinute = 60;
  const minutesPerHour = 60;
  const hoursPerDay = 24;
  const millisecondsPerSecond = 1000;
  const delta = Math.abs(pastDate - now);
  const seconds = Math.floor(delta / millisecondsPerSecond);
  const minutes = Math.floor(seconds / secondsPerMinute);
  const hours = Math.floor(minutes / minutesPerHour);
  const days = Math.floor(hours / hoursPerDay);
  if (seconds < 1 * secondsPerMinute) {
    return seconds === 0 ? "刚刚" : `${seconds}秒前`;
  }
  if (seconds < 2 * secondsPerMinute) {
    return "1分钟前";
  }
  if (minutes < 1 * minutesPerHour) {
    return `${minutes}分钟前`;
  }
  if (hours < 1 * hoursPerDay) {
    return `${hours}小时前`;
  }
  if (days < 1) {
    return `${hours}小时前`; // 修正:如果小于一天,使用小时计算
  }
  return `${Math.floor(days)}天前`;
}
// 使用示例
const relativeTime = formatDateRelative("2024-05-22 16:47:00");
 
// 计算给定时间一周内日期和星期,工作中常常需要传入一周数据,如周报等
// 这个方法可以拿到给定日期一周内的所有需要的数据
const nextWeekDates = function (time) {
  const nextWeek = [];
  // 获取给定日期是星期几
  const weekdays = [
    "周日",
    "周一",
    "周二",
    "周三",
    "周四",
    "周五",
    "周六",
  ];
  const weekday = weekdays[time.getDay()];
 
  // 计算这一周或上一周的日期和星期
  const currentDate = new Date(time.getTime());
  currentDate.setDate(currentDate.getDate() - currentDate.getDay() + 1);
 
  if (weekday === "周日") {
    currentDate.setDate(currentDate.getDate() - 7);
  }
  for (let i = 0; i < 7; i++) {
    const date = new Date(
      currentDate.getTime() + i * 24 * 60 * 60 * 1000
    );
    const stamp = formatDate(date, "YYYY/MM/DD");
    let stampSen = null;
    if (i !== 6) {
      stampSen = formatDate(date, "YYYY/MM/DD") + " 00:00:00";
    } else {
      stampSen = formatDate(date, "YYYY/MM/DD") + " 23:59:59";
    }
    const month = date.getMonth() + 1;
    const day = date.getDate();
    const dateString = `${month}/${day}`;
    const weekday = weekdays[date.getDay()];
    const dayDate = date;
    nextWeek.push({
      stamp: stamp,
      date: dateString,
      weekday,
      dateTime: dayDate,
      stampSen: stampSen,
    });
  }
  return nextWeek;
};