微信小程序开发中强大的日期时间工具库——dateTimeUtils


前言

在微信小程序开发中,日期和时间的处理是不可避免的一项任务,尤其是格式化、解析、计算日期差异等需求。在复杂的业务场景下,操作日期和时间通常是棘手且容易出错的,因此拥有一个高效、强大的日期时间工具库变得尤为重要。

今天,我将介绍一个我封装的 dateTimeUtils 模块,旨在简化日期与时间的操作,并且确保代码更加简洁和可维护。无论你是需要日期的格式化、获取某一天的开始或结束时间,还是计算日期差,dateTimeUtils 都能帮助你轻松完成这些任务。让我们一起来了解这个工具库的强大功能吧!


功能简介

该工具库涵盖了多个常见的日期时间操作功能,如日期格式化、获取当前时间、获取开始/结束时间、时间戳转换、计算日期差、获取相对时间等。以下是它的主要功能模块:

1.	日期格式化:将日期转换为指定格式的字符串。
2.	获取当前日期时间:返回格式化后的当前日期时间。
3.	获取某天的开始/结束时间:轻松获取某一天的 00:00:00 或 23:59:59。
4.	时间戳转换:将时间戳转换为日期或将日期转换为时间戳。
5.	计算日期差:计算两个日期之间的天数差。
6.	获取相对时间:返回某个时间相对于当前时间的描述(如”1小时前”、“昨天”)。
7.	日期加减:可以在日期上加减天数。
8.	日期格式验证:检测日期格式是否有效。

主要功能介绍

1.日期格式化

export const formatDate = (
  date: Date | number | string,
  format: string = "YYYY-MM-DD HH:mm:ss"
): string => {
  // 日期格式化函数,兼容iOS,将'-'替换为'/'
};

formatDate 可以帮助我们将 Date 对象、时间戳或日期字符串格式化为指定的格式。支持多种常见格式,默认格式为 YYYY-MM-DD HH:mm:ss。比如,你可以将当前日期格式化为 YYYY/MM/DD 或 MM-DD。

使用示例:

formatDate(new Date(), "YYYY/MM/DD"); // 返回 "2024/08/28"

2. 获取当前日期时间

export const getCurrentDateTime = (format?: string): string => {
  // 获取当前时间,默认格式为 "YYYY-MM-DD HH:mm:ss"
};

getCurrentDateTime 用于返回当前日期时间,格式化后的输出可以自定义。默认输出格式为 YYYY-MM-DD HH:mm:ss。

使用示例:

getCurrentDateTime(); // 返回 "2024-08-28 11:23:30"

3. 获取某天的开始/结束时间

getStartOfDay 和 getEndOfDay 是用来获取某个日期的 00:00:00 和 23:59:59。

export const getStartOfDay = (date: Date | number | string): string => {
  // 获取某天的开始时间,格式为 "YYYY-MM-DD 00:00:00"
};
export const getEndOfDay = (date: Date | number | string): string => {
  // 获取某天的结束时间,格式为 "YYYY-MM-DD 23:59:59"
};

使用示例:

getStartOfDay("2024-08-28"); // 返回 "2024-08-28 00:00:00"
getEndOfDay("2024-08-28");   // 返回 "2024-08-28 23:59:59"

4. 时间戳转换

你可以轻松将时间戳转换为格式化的日期,或者将日期转换为时间戳。

export const timestampToDate = (
  timestamp: number,
  format: string = "YYYY-MM-DD HH:mm:ss"
): string => {
  // 将时间戳转换为指定格式的日期
};
export const dateToTimestamp = (date: Date | number | string): number => {
  // 将日期转换为时间戳
};

使用示例:

timestampToDate(1693218210000);  // 返回 "2024-08-28 11:23:30"
dateToTimestamp("2024-08-28 11:23:30"); // 返回 1693218210000

5. 计算日期差

daysBetween 可以计算两个日期之间的天数差。这在项目开发中是非常常见的需求。

export const daysBetween = (
  startDate: Date | number | string,
  endDate: Date | number | string
): number => {
  // 计算两个日期之间的天数差
};

使用示例:

daysBetween("2024-08-28", "2024-09-05"); // 返回 8

6. 获取相对时间描述

getRelativeTime 计算一个日期相对于当前时间的描述,常用于消息时间戳、日志时间等场景。

export const getRelativeTime = (date: Date | number | string): string => {
  // 返回相对当前时间的描述,比如"1小时前"、"昨天"
};

使用示例:

getRelativeTime("2024-08-28 10:00:00"); // 返回 "1 小时前"

7. 日期加减

addDays 函数用于对日期进行加减操作,可以灵活地计算未来或过去的某一天。

export const addDays = (
  date: Date | number | string,
  days: number,
  format: string = "YYYY-MM-DD"
): string => {
  // 日期加减操作
};

使用示例:

addDays("2024-08-28", 5); // 返回 "2024-09-02"

8. 日期验证与格式解析

工具库还提供了 isValidDate 和 parseDateString,用于验证日期是否有效,以及解析复杂的日期字符串。

export const isValidDate = (date: Date | number | string): boolean => {
  // 验证日期格式是否有效
};

export const parseDateString = (dateStr: string): string => {
  // 将标准时间字符串转换为"YYYY-MM-DD"格式
};

使用示例:

isValidDate("2024-08-28");  // 返回 true
parseDateString("Wed Aug 21 2024 00:00:00 GMT+0800");  // 返回 "2024-08-21"

9. 日期加减操作与格式化

manipulateDate 是一个强大的日期操作函数,能够根据传入的参数对日期进行加减操作,并返回格式化的结果。

export const manipulateDate = (
  data: string,
  type: "add" | "minus",
  day: number
): string => {
  // 日期加减操作并格式化输出
};

使用示例:

manipulateDate("08月21日", "add", 10); // 返回 "2024-08-31"

总结

dateTimeUtils 是一个功能丰富的日期时间处理工具库,提供了多种实用的日期操作函数,能够有效简化日期时间相关的复杂操作。无论是常见的日期格式化、时间戳转换,还是复杂的日期加减、相对时间描述等功能,它都能轻松应对。

希望这篇文章能帮助你更好地理解并使用这个工具库,提高你的开发效率!欢迎将 dateTimeUtils 集成到你的项目中,享受更加轻松的日期处理体验!

下载并使用:

文章顶部的下载链接有dateTimeUtils 的完整代码示例

附上完整的代码:

// 日期格式化
/**
 * formatDate - 将日期格式化为指定的字符串格式。
 * @param date - 要格式化的日期,可以是 Date 对象、时间戳(number)或字符串。
 * @param format - 目标格式的字符串,默认值为 "YYYY-MM-DD HH:mm:ss"。
 * @returns string - 格式化后的日期字符串。
 *
 * 示例:
 * formatDate(new Date(), "YYYY/MM/DD"); // 返回 "2024/08/28"
 */
export const formatDate = (
  date: Date | number | string,
  format: string = "YYYY-MM-DD HH:mm:ss"
): string => {
  let dateObj: Date;

  if (typeof date === "string") {
    // 兼容 iOS 日期格式,将 '-' 替换为 '/'
    date = date.replace(/-/g, "/");
    dateObj = new Date(date);
  } else if (typeof date === "number") {
    dateObj = new Date(date);
  } else {
    dateObj = date;
  }

  // 检查 Date 对象是否有效
  if (isNaN(dateObj.getTime())) {
    console.error("Invalid Date:", date);
    return "Invalid Date";
  }

  const padZero = (num: number) => (num < 10 ? "0" + num : num.toString());

  const replacements: { [key: string]: string } = {
    YYYY: dateObj.getFullYear().toString(),
    MM: padZero(dateObj.getMonth() + 1),
    DD: padZero(dateObj.getDate()),
    HH: padZero(dateObj.getHours()),
    mm: padZero(dateObj.getMinutes()),
    ss: padZero(dateObj.getSeconds()),
  };

  return format.replace(/YYYY|MM|DD|HH|mm|ss/g, (match) => replacements[match]);
};

// 获取当前日期时间
/**
 * getCurrentDateTime - 获取当前日期时间,并按指定格式返回。
 * @param format - 可选的日期时间格式,默认值为 "YYYY-MM-DD HH:mm:ss"。
 * @returns string - 当前日期时间的格式化字符串。
 *
 * 示例:
 * getCurrentDateTime(); // 返回 "2024-08-28 11:23:30"
 */
export const getCurrentDateTime = (format?: string): string => {
  const defaultFormat = "YYYY-MM-DD HH:mm:ss";
  return formatDate(new Date(), format || defaultFormat);
};

// 获取某天的开始时间 (00:00:00)
/**
 * getStartOfDay - 获取某天的开始时间,格式为 "YYYY-MM-DD 00:00:00"。
 * @param date - 要获取开始时间的日期,可以是 Date 对象、时间戳(number)或字符串。
 * @returns string - 开始时间的格式化字符串。
 *
 * 示例:
 * getStartOfDay("2024-08-28"); // 返回 "2024-08-28 00:00:00"
 */
export const getStartOfDay = (date: Date | number | string): string => {
  const d = new Date(date);
  d.setHours(0, 0, 0, 0);
  return formatDate(d);
};

// 获取某天的结束时间 (23:59:59)
/**
 * getEndOfDay - 获取某天的结束时间,格式为 "YYYY-MM-DD 23:59:59"。
 * @param date - 要获取结束时间的日期,可以是 Date 对象、时间戳(number)或字符串。
 * @returns string - 结束时间的格式化字符串。
 *
 * 示例:
 * getEndOfDay("2024-08-28"); // 返回 "2024-08-28 23:59:59"
 */
export const getEndOfDay = (date: Date | number | string): string => {
  const d = new Date(date);
  d.setHours(23, 59, 59, 999);
  return formatDate(d);
};

// 将时间戳转换为指定格式
/**
 * timestampToDate - 将时间戳转换为指定格式的日期字符串。
 * @param timestamp - 时间戳(毫秒数)。
 * @param format - 日期时间格式,默认值为 "YYYY-MM-DD HH:mm:ss"。
 * @returns string - 格式化后的日期字符串。
 *
 * 示例:
 * timestampToDate(1693218210000, "YYYY/MM/DD"); // 返回 "2024/08/28"
 */
export const timestampToDate = (
  timestamp: number,
  format: string = "YYYY-MM-DD HH:mm:ss"
): string => {
  return formatDate(new Date(timestamp), format);
};

// 将指定格式的日期转换为时间戳
/**
 * dateToTimestamp - 将指定格式的日期转换为时间戳。
 * @param date - 要转换的日期,可以是 Date 对象、时间戳(number)或字符串。
 * @returns number - 转换后的时间戳(毫秒数)。
 *
 * 示例:
 * dateToTimestamp("2024-08-28 11:23:30"); // 返回 1693218210000
 */
export const dateToTimestamp = (date: Date | number | string): number => {
  return new Date(date).getTime();
};

// 计算两个日期之间的天数
/**
 * daysBetween - 计算两个日期之间的天数。
 * @param startDate - 起始日期,可以是 Date 对象、时间戳(number)或字符串。
 * @param endDate - 结束日期,可以是 Date 对象、时间戳(number)或字符串。
 * @returns number - 两个日期之间的天数。
 *
 * 示例:
 * daysBetween("2024-08-28", "2024-09-05"); // 返回 8
 */
export const daysBetween = (
  startDate: Date | number | string,
  endDate: Date | number | string
): number => {
  const start = new Date(startDate).setHours(0, 0, 0, 0);
  const end = new Date(endDate).setHours(0, 0, 0, 0);
  return Math.floor((end - start) / (1000 * 60 * 60 * 24));
};

// 获取相对当前时间的描述 (例如:1小时前、昨天)
/**
 * getRelativeTime - 获取相对当前时间的描述,例如 "1小时前"、"昨天" 等。
 * @param date - 要转换的日期,可以是 Date 对象、时间戳(number)或字符串。
 * @returns string - 相对时间的描述字符串。
 *
 * 示例:
 * getRelativeTime("2024-08-28 10:00:00"); // 返回 "1 小时前"
 */
export const getRelativeTime = (date: Date | number | string): string => {
  const now = new Date();
  const diffMs = now.getTime() - new Date(date).getTime();
  const diffMinutes = Math.floor(diffMs / (1000 * 60));
  const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
  const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));

  if (diffMinutes < 60) {
    return `${diffMinutes} 分钟前`;
  } else if (diffHours < 24) {
    return `${diffHours} 小时前`;
  } else if (diffDays < 7) {
    return `${diffDays} 天前`;
  } else {
    return formatDate(date, "YYYY-MM-DD");
  }
};

// 获取当前日期前/后的指定天数的日期
/**
 * addDays - 获取指定日期前/后的指定天数的日期。
 * @param date - 要操作的日期,可以是 Date 对象、时间戳(number)或字符串。
 * @param days - 要添加或减少的天数,可以是正数(添加)或负数(减少)。
 * @param format - 日期格式,默认值为 "YYYY-MM-DD"。
 * @returns string - 操作后的日期字符串。
 *
 * 示例:
 * addDays("2024-08-28", 5); // 返回 "2024-09-02"
 */
export const addDays = (
  date: Date | number | string,
  days: number,
  format: string = "YYYY-MM-DD"
): string => {
  const d = new Date(date);
  d.setDate(d.getDate() + days);
  return formatDate(d, format);
};

// 验证日期格式是否有效
/**
 * isValidDate - 验证给定的日期格式是否有效。
 * @param date - 要验证的日期,可以是 Date 对象、时间戳(number)或字符串。
 * @returns boolean - 如果日期有效则返回 true,否则返回 false。
 *
 * 示例:
 * isValidDate("2024-08-28"); // 返回 true
 * isValidDate("Invalid-Date"); // 返回 false
 */
export const isValidDate = (date: Date | number | string): boolean => {
  const d = new Date(date);
  return !isNaN(d.getTime());
};

// 标准时间转为 yyyy-MM-dd
/**
 * parseDateString - 将标准日期字符串转换为 "YYYY-MM-DD" 格式。
 * @param dateStr - 标准的日期字符串。
 * @returns string - 转换后的 "YYYY-MM-DD" 日期字符串。
 *
 * 示例:
 * parseDateString("Wed Aug 21 2024 00:00:00 GMT+0800 (中国标准时间)"); // 返回 "2024-08-21"
 */
export const parseDateString = (dateStr: string): string => {
  const date = new Date(dateStr);

  if (isNaN(date.getTime())) {
    throw new Error("Invalid date format");
  }

  const padZero = (num: number) => (num < 10 ? "0" + num : num.toString());

  const year = date.getFullYear();
  const month = padZero(date.getMonth() + 1); // 月份从 0 开始
  const day = padZero(date.getDate());

  return `${year}-${month}-${day}`;
};

// 处理日期加减操作并格式化输出
/**
 * manipulateDate - 处理日期加减操作并格式化输出。
 * @param data - 传入的日期字符串,可以是 "YYYY-MM-DD hh:mm:ss"、"MM月DD日"、"YYYY-MM-DD" 等格式。如果没有年份,则默认使用当前年。
 * @param type - 操作类型,"add" 表示加天数,"minus" 表示减天数。
 * @param day - 要加或减的天数。
 * @returns string - 返回处理后的日期字符串,格式为 "YYYY-MM-DD"。
 *
 * 示例:
 * manipulateDate("08月21日", "add", 10); // 返回 "2024-08-31"
 * manipulateDate("2024-08-21 11:23:30", "minus", 5); // 返回 "2024-08-16"
 */
export const manipulateDate = (
  data: string,
  type: "add" | "minus",
  day: number
): string => {
  // 当前年份
  const currentYear = new Date().getFullYear();

  // 替换日期格式以兼容 iOS
  let formattedDate = data
    .replace(/(\d{1,2})月(\d{1,2})日/, `${currentYear}/$1/$2`) // 处理 "MM月DD日" 格式
    .replace(/-/g, "/"); // 将 "-" 替换为 "/"

  // 如果日期中不包含年份,则加上当前年份
  if (!/\d{4}/.test(formattedDate)) {
    formattedDate = `${currentYear}/${formattedDate}`;
  }

  let dateObj = new Date(formattedDate);

  // 检查日期是否有效
  if (isNaN(dateObj.getTime())) {
    console.error("Invalid Date:", formattedDate);
    return "Invalid Date";
  }

  // 根据 type 参数进行日期加减操作
  if (type === "add") {
    dateObj.setDate(dateObj.getDate() + day);
  } else if (type === "minus") {
    dateObj.setDate(dateObj.getDate() - day);
  }

  // 格式化返回的日期为 "YYYY-MM-DD" 格式
  const padZero = (num: number) => (num < 10 ? "0" + num : num.toString());
  const result = `${dateObj.getFullYear()}-${padZero(
    dateObj.getMonth() + 1
  )}-${padZero(dateObj.getDate())}`;

  return result;
};

// 导出所有模块
export default {
  formatDate,
  getCurrentDateTime,
  getStartOfDay,
  getEndOfDay,
  timestampToDate,
  dateToTimestamp,
  daysBetween,
  getRelativeTime,
  addDays,
  isValidDate,
  parseDateString,
  manipulateDate,
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值