文章目录
前言
在微信小程序开发中,日期和时间的处理是不可避免的一项任务,尤其是格式化、解析、计算日期差异等需求。在复杂的业务场景下,操作日期和时间通常是棘手且容易出错的,因此拥有一个高效、强大的日期时间工具库变得尤为重要。
今天,我将介绍一个我封装的 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,
};