在日常的项目开发中,我们经常需要面对各种日期时间的展示需求。然而,不同的场景对日期时间的格式要求各不相同,这就导致了团队中每位开发者都独立地编写代码来满足各自的需求。长此以往,项目中出现了大量的重复且冗余的代码。这种现象不仅严重降低了我们的开发效率,还与代码规范中倡导的避免重复代码(DRY-Don't Repeat Yourself)和保持一致性的原则背道而驰。
那么,如何在保证代码质量的同时,又能避免这种重复呢?这便是我们今天要探讨的主题——通过封装一个通用的日期格式化函数,让代码更加简洁、高效。
虽然DRY原则强调避免重复代码,但过度封装也并非明智之举。过度的封装会使代码变得复杂难懂,难以维护。因此,在封装时,我们需要权衡代码的通用性和灵活性,找到一个平衡点。
为了减少重复代码,提升代码的可复用性和可维护性,我尝试封装了一个易于使用的日期格式化工具函数。下面是我对这个函数的详细解析。
首先,我们来看一下这个函数的实现:
function dateFormatter(format: string = 'YYYY-MM-DD HH:mm:ss', date: Date | string | number = new Date()): string {
let parsedDate: Date;
if (date instanceof Date) {
parsedDate = date;
} else if (typeof date === 'string' || typeof date === 'number') {
parsedDate = new Date(date);
} else {
parsedDate = new Date();
}
const year = parsedDate.getFullYear();
const month = parsedDate.getMonth();
const day = parsedDate.getDate();
const weekday = parsedDate.getDay();
const hour = parsedDate.getHours();
const minute = parsedDate.getMinutes();
const second = parsedDate.getSeconds();
const millisecond = parsedDate.getMilliseconds();
const FULL_WEEKDAYS = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
const SHORT_WEEKDAYS = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
const MONTHS_CHINESE = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'];
const MONTHS_SHORT_EN = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
const MONTHS_LONG_EN = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
const QUARTERS = ['一季度', '二季度', '三季度', '四季度'];
const getQuarter = (month: number) => Math.ceil((month + 1) / 3);
const PLACEHOLDER_MAPPING = {
Y: year.toString(),
YY: year.toString().slice(-2),
M: (month + 1).toString(),
MM: (month + 1).toString().padStart(2, '0'),
MMM: MONTHS_SHORT_EN[month],
MMMM: MONTHS_LONG_EN[month],
D: day.toString(),
DD: day.toString().padStart(2, '0'),
W: weekday.toString(),
WW: SHORT_WEEKDAYS[weekday],
WWW: FULL_WEEKDAYS[weekday],
Q: getQuarter(month).toString(),
QQ: QUARTERS[getQuarter(month) - 1],
H: hour.toString(),
HH: hour.toString().padStart(2, '0'),
h: (hour % 12 || 12).toString(),
hh: (hour % 12 || 12).toString().padStart(2, '0'),
A: hour >= 12 ? 'PM' : 'AM',
a: hour >= 12 ? 'pm' : 'am',
m: minute.toString(),
mm: minute.toString().padStart(2, '0'),
s: second.toString(),
ss: second.toString().padStart(2, '0'),
S: millisecond.toString(),
SS: millisecond.toString().padStart(2, '0'),
SSS: millisecond.toString().padStart(3, '0')
};
return format.replace(/Y+|M+|D+|W+|Q+|H+|h+|A|a|m+|s+|S+/g, (match) => {
return PLACEHOLDER_MAPPING[match] || '';
});
}
这个函数接收两个参数:format
和 date
。format
是日期时间的格式字符串,date
是要格式化的日期时间对象或字符串。函数内部首先解析出年、月、日、小时、分钟、秒和毫秒的值,然后根据这些值从预定义的常量中获取对应的中文和英文名称,并替换到格式字符串中的相应占位符位置。
例如,如果我们想要格式化一个日期为 "2023年6月30日 14:30:00",我们可以这样调用函数:
const formattedDate = dateFormatter('YYYY年MM月DD日 HH:mm:ss', '2023-06-30 14:30:00');
console.log(formattedDate); // 输出:2023年06月30日 14:30:00
以上便是我对封装日期格式化函数的详细解析。希望能为大家在实际开发中提供一些帮助。当然,由于个人能力和经验的限制,这个函数可能存在一些不足之处,欢迎大家提出宝贵的意见和建议。
声明:
1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。
2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。
3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。
4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
Copyright 2005-2024 yuanmayuan.com 【源码园】 版权所有 备案信息
声明: 本站非腾讯QQ官方网站 所有软件和文章来自互联网 如有异议 请与本站联系 本站为非赢利性网站 不接受任何赞助和广告