日期格式化

2,515 阅读4分钟
原文链接: zhuanlan.zhihu.com

敲、敲、敲代码的时候,遇到日期的显示,每次都要格式化一遍,使用过python的time.strftime,感觉真tm的方便,决定来个轮子.

python中时间日期格式化符号

%y 两位数的年份表示(00-99)

%Y 四位数的年份表示(000-9999)

%m 月份(01-12)

%d 月内中的一天(0-31)

%H 24小时制小时数(0-23)

%I 12小时制小时数(01-12)

%M 分钟数(00=59)

%S 秒(00-59)

%a 本地简化星期名称

%A 本地完整星期名称

%b 本地简化的月份名称

%B 本地完整的月份名称

%c 本地相应的日期表示和时间表示

%j 年内的一天(001-366)

%p 本地A.M.或P.M.的等价符

%U 一年中的星期数(00-53)星期天为星期的开始

%w 星期(0-6),星期天为星期的开始

%W 一年中的星期数(00-53)星期一为星期的开始

%x 本地相应的日期表示

%X 本地相应的时间表示

%Z 当前时区的名称

%% %号本身

眼前不觉一阵眩晕,这么多,有些匹配一辈子用不到一次的,而有想起weex说的Write it once, run multiple,我也来个Write it once,use it for ever(一次编写,永久使用)

Write it once,use it for ever

首先我要先写几个小工具:(我把公用的这些函数放在了Date上)

日期格式的判断

if (!Date.isDate) {//是否是日期格式
    Object.defineProperty(Date, 'isDate', {
        value: function (date) {
		return Object.prototype.toString.call(date) === "[object Date]";
	},
        configurable: true,
        enumerable: false,
        writable: true
    });
}

闰年的判断

if (!Date.isLeapYear) {
    Object.defineProperty(Date, 'isLeapYear', {
        value: function (year) {//是否是闰年
		year = year >>> 0;//参数必须是正整数
		return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
	},
        configurable: true,
        enumerable: false,
        writable: true
    });
}

获取一个月的天数(函数没有封装在Date上)

function getMonthDays(year, month) {//一个月多少天,月份(1-12),参数最好是整数类型,不然会有意想不到的结果呦
	var date;//如果没有传参数,默认创建一个以今天为基础的日期
	if (Date.isDate(arguments[0])) {//如果以日期格式为参数
		date = arguments[0];
		year = date.getFullYear();
  		month = date.getMonth() + 1;
	} else {
		date = new Date();
		year = year > 0 ? year >>> 0 : date.getFullYear();
		month = month > 0 ? month % 13 : date.getMonth() + 1;
	}
	return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month - 1] || (Date.isLeapYear(year) ? 29 : 28);
}

获取一个日期是这一年的第几天

function getDayNumber(year, month, day) {//参数最好是整数类型,不然会有意想不到的结果呦
	var date;//如果没有传参数,默认创建一个以今天为基础的日期
	if (Date.isDate(arguments[0])) {//如果以日期格式为参数
		date = arguments[0];
		year = date.getFullYear();
  		month = date.getMonth() + 1;
	} else {
		date = new Date();
		year = year > 0 ? year >>> 0 : date.getFullYear();
		month = month > 0 ? month % 13 : date.getMonth() + 1;
		day = day > 0 ? day >>> 0 : date.getDate();
	}
	//年内的第几天(001-366)
	for (var i = 1; i < month; i++) {
	    day += getMonthDays(year, i);
	}
	return day;
}

猪脚登场:日期时间格式化

if (!Date.prototype.format){
	Object.defineProperty(Date.prototype, "format", {
        value: Date.prototype.format = function (fmt) {
		var week = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
		var weekShortName = ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat'];
		var month = ["December", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November"]
		var monthShortName = ["Dec", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov"];
		var regs = {
			'%y': this.getFullYear() % 100,//两位数的年份表示(00-99)
			'%Y': this.getFullYear(),//四位数的年份表示(000-9999)
			'%m': this.getMonth() + 1,//月份(01-12)
			'%d': this.getDate(),//月内中的一天(0-31)
			'%H': this.getHours(),//24小时制小时数(0-23)
			'%I': this.getHours() % 12 + 1,//12小时制小时数(01-12)
			'%M': this.getMinutes(),//分钟数(00=59)
			'%S': this.getSeconds(),//秒(00-59)
			'%a': weekShortName[this.getDay()],//本地简化星期名称
			'%A': week[this.getDay()],//本地完整星期名称
			'%b': monthShortName[this.getMonth()],//本地简化的月份名称
			'%B': month[this.getMonth()],//本地完整的月份名称
			'%c': this.toLocaleString(),//本地相应的日期表示和时间表示
			'%j': getDayNumber(),//年内的第几天(001-366)
			'%u': Math.ceil(getDayNumber() / 7),//一年中的星期数(00-53)星期一为星期的开始
			'%U': this.getDay() == 0 ? parseInt(getDayNumber() / 7) + 1 : parseInt(getDayNumber() / 7),//一年中的星期数(00-53)星期日为星期的开始
			'%w': this.getDay(),//星期(0-6),星期日为星期的开始
			"%q": Math.ceil((this.getMonth() + 1) / 3), //季度
			'%x': this.toLocaleDateString(),//本地相应的日期表示
			'%X': this.toLocaleTimeString(),//本地相应的时间表示
		};
		//格式化匹配
		for (var k in regs) {
			if (new RegExp("(" + k + ")").test(fmt)) {
				fmt = fmt.replace(RegExp.$1, regs[k]);
			}
                }
		return fmt;
	},
        configurable: true,
        enumerable: false,
        writable: true
	});
}

举个栗子

var d = new Date();
console.log(d.format("%y--%Y--%m--%d--%H--%I--%M--%S--%a--%A--%b--%B--%c--%j--%u--%U--%w--%q--%x--%X"))
结果展示

这里是源码的位置

JavaScript日期时间格式化

如有错误,欢迎指正!