JavaScript 实现 PHP date() 风格的日期格式化函数
在 Web 开发中,原生 JavaScript 的 Date 对象虽功能丰富但格式化操作繁琐,远不如 PHP 的 date() 函数直观高效。本文将分享一个轻量级的 JavaScript 函数,它模拟了 PHP 的日期格式化行为,支持多种常用时间格式标识符的自动替换,帮助开发者快速生成标准化的日期时间字符串。
核心功能与适用场景
这段代码主要解决的是前端需要按照特定格式(如 "Y-m-d H:i:s" 或 "d/m/Y")显示时间的问题。虽然现代 JavaScript 有了 Intl.DateTimeFormat 和库(如 Day.js、moment),但在某些轻量级需求或旧项目维护中,直接嵌入一小段通用格式化逻辑往往更加便捷,无需引入额外依赖。
该函数允许开发者使用类似于 PHP 的格式字符来定义输出样式,极大地降低了学习成本和编码复杂度。
完整代码实现
以下是经过整理和优化的 JavaScript 日期格式化函数。它接受两个参数:a 为格式字符串,s 为可选的时间戳或日期字符串。若无 s,则默认使用当前系统时间。
var date = function( a, s ) {
var d = s ? new Date( s ) : new Date(), f = d.getTime();
return ( '' + a ).replace( /a|A|d|D|F|g|G|h|H|i|I|j|l|L|m|M|n|s|S|t|T|U|w|y|Y|z|Z/g, function ( a ) {
switch ( a ) {
case 'a' : return d.getHours() > 11 ? 'pm' : 'am';
case 'A' : return d.getHours() > 11 ? 'PM' : 'AM';
case 'd' : return ( '0' + d.getDate() ).slice(-2);
case 'D' : return [ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ][ d.getDay() ];
case 'F' : return [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ][ d.getMonth() ];
case 'g' : return ( s = ( d.getHours() || 12 ) ) > 12 ? s - 12 : s;
case 'G' : return d.getHours();
case 'h' : return ( '0' + ( ( s = d.getHours() || 12 ) > 12 ? s - 12 : s ) ).slice(-2);
case 'H' : return ( '0' + d.getHours() ).slice(-2);
case 'i' : return ( '0' + d.getMinutes() ).slice(-2);
case 'I' : return (function(){ d.setDate(1); d.setMonth(0); s = [ d.getTimezoneOffset() ]; d.setMonth(6); s[1] = d.getTimezoneOffset(); d.setTime( f ); return s[0] == s[1] ? 0 : 1; })();
case 'j' : return d.getDate();
case 'l' : return [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ][ d.getDay() ];
case 'L' : return ( s = d.getFullYear() ) % 4 == 0 && ( s % 100 != 0 || s % 400 == 0 ) ? 1 : 0;
case 'm' : return ( '0' + ( d.getMonth() + 1 ) ).slice(-2);
case 'M' : return [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ][ d.getMonth() ];
case 'n' : return d.getMonth() + 1;
case 's' : return ( '0' + d.getSeconds() ).slice(-2);
case 'S' : return [ 'th', 'st', 'nd', 'rd' ][ ( s = d.getDate() ) < 4 ? s : 0 ];
case 't' : return (function(){ d.setDate(32); s = 32 - d.getDate(); d.setTime( f ); return s; })();
case 'T' : return 'UTC';
case 'U' : return ( '' + f ).slice( 0, -3 );
case 'w' : return d.getDay();
case 'y' : return ( '' + d.getFullYear() ).slice(-2);
case 'Y' : return d.getFullYear();
case 'z' : return (function(){ d.setMonth(0); return d.setTime( f - d.setDate(1) ) / 86400000; })();
default : return -d.getTimezoneOffset() * 60;
};
} );
};
关键格式标识符说明
为了确保你能够正确使用此函数,以下列出了一些最常用的格式字符及其对应的返回值:
Y:四位数的年份,如 2023。m:数字表示的月份,有前导零,如 01 到 12。d:月份中的第几天,有前导零,如 01 到 31。H:24 小时格式的小时数,有前导零,如 00 到 23。i:有前导零的分钟数,如 00 到 59。s:有前导零的秒数,如 00 到 59。F:完整的月份名称,如 January。D:星期几的英文缩写,如 Mon。
使用示例与结果验证
你可以直接在浏览器控制台或 Node.js 环境中运行以下代码来测试效果:
// 获取当前时间的标准格式
console.log(date('Y-m-d H:i:s'));
// 输出示例: 2023-10-27 14:30:05
// 指定时间戳或日期字符串
console.log(date('d/m/Y', '2023-10-27'));
// 输出示例: 27/10/2023
// 中文环境下的友好显示
console.log(date('l, F j, Y, g:i a'));
// 输出示例: Friday, October 27, 2023, 2:30 pm
该函数通过正则表达式全局匹配格式串中的特殊字符,并通过 switch-case 结构进行动态替换,最终返回完全符合预期格式的字符串。
注意事项
- 性能考量:此函数在处理单个日期格式化时效率极高,但如果需要在极短时间内格式化成千上万个日期,建议将其封装为类或使用更现代化的国际化 API (Intl)。
- 时区问题:JS Date 对象默认基于浏览器所在时区。如果需要 UTC 时间,请传入 UTC 相关的时间戳或使用
T标识符(注:原代码中T固定返回 'UTC',如需精确时区偏移量需自行扩展)。 - 兼容性:代码使用了 ES5 标准的语法特性,兼容绝大多数浏览器及 Node.js 环境。
以上就是JavaScript强大的日期格式化函数代码分享的详细内容,更多关于JavaScript日期处理技巧的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









