@@ -278,29 +278,45 @@ if (!String.prototype.padStart) {
278278 * @param {String } fmt 格式化规则 yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合 默认yyyy-mm-dd
279279 * @returns {string } 返回格式化后的字符串
280280 */
281- function timeFormat ( dateTime = null , fmt = 'yyyy-mm-dd' ) {
282- // 如果为null,则格式化当前时间
283- if ( ! dateTime ) dateTime = Number ( new Date ( ) )
284- // 如果dateTime长度为10或者13,则为秒和毫秒的时间戳,如果超过13位,则为其他的时间格式
285- if ( dateTime . toString ( ) . length == 10 ) dateTime *= 1000
286- const date = new Date ( dateTime )
287- let ret
288- const opt = {
289- 'y+' : date . getFullYear ( ) . toString ( ) , // 年
290- 'm+' : ( date . getMonth ( ) + 1 ) . toString ( ) , // 月
291- 'd+' : date . getDate ( ) . toString ( ) , // 日
292- 'h+' : date . getHours ( ) . toString ( ) , // 时
293- 'M+' : date . getMinutes ( ) . toString ( ) , // 分
294- 's+' : date . getSeconds ( ) . toString ( ) // 秒
281+ function timeFormat ( dateTime = null , formatStr = 'yyyy-mm-dd' ) {
282+ let date
283+ // 若传入时间为假值,则取当前时间
284+ if ( ! dateTime ) {
285+ date = new Date ( )
286+ }
287+ // 若为unix秒时间戳,则转为毫秒时间戳(逻辑有点奇怪,但不敢改,以保证历史兼容)
288+ else if ( / ^ \d { 10 } $ / . test ( dateTime ?. toString ( ) . trim ( ) ) ) {
289+ date = new Date ( dateTime * 1000 )
290+ }
291+ // 若用户传入字符串格式时间戳,new Date无法解析,需做兼容
292+ else if ( typeof dateTime === 'string' && / ^ \d + $ / . test ( dateTime . trim ( ) ) ) {
293+ date = new Date ( Number ( dateTime ) )
294+ }
295+ // 其他都认为符合 RFC 2822 规范
296+ else {
297+ date = new Date ( dateTime )
298+ }
299+
300+ const timeSource = {
301+ 'y' : date . getFullYear ( ) . toString ( ) , // 年
302+ 'm' : ( date . getMonth ( ) + 1 ) . toString ( ) . padStart ( 2 , '0' ) , // 月
303+ 'd' : date . getDate ( ) . toString ( ) . padStart ( 2 , '0' ) , // 日
304+ 'h' : date . getHours ( ) . toString ( ) . padStart ( 2 , '0' ) , // 时
305+ 'M' : date . getMinutes ( ) . toString ( ) . padStart ( 2 , '0' ) , // 分
306+ 's' : date . getSeconds ( ) . toString ( ) . padStart ( 2 , '0' ) // 秒
295307 // 有其他格式化字符需求可以继续添加,必须转化成字符串
296308 }
297- for ( const k in opt ) {
298- ret = new RegExp ( `(${ k } )` ) . exec ( fmt )
299- if ( ret ) {
300- fmt = fmt . replace ( ret [ 1 ] , ( ret [ 1 ] . length == 1 ) ? ( opt [ k ] ) : ( opt [ k ] . padStart ( ret [ 1 ] . length , '0' ) ) )
301- }
302- }
303- return fmt
309+
310+ for ( const key in timeSource ) {
311+ const [ ret ] = new RegExp ( `${ key } +` ) . exec ( formatStr ) || [ ]
312+ if ( ret ) {
313+ // 年可能只需展示两位
314+ const beginIndex = key === 'y' && ret . length === 2 ? 2 : 0
315+ formatStr = formatStr . replace ( ret , timeSource [ key ] . slice ( beginIndex ) )
316+ }
317+ }
318+
319+ return formatStr
304320}
305321
306322/**
0 commit comments