概序

前段时间, 朋友叫我把new Date的功能扩展一下,我说网上不是有一堆么,他说太复杂了,让我搞个简单点的。
憋了半天,发现简单不起来啊,只能搞个简化版的出来。
目前常用功能有这样几个:获取现在时间戳、获取今天时间戳、获取周、月、am、pm、任意格式化时间。
因为不喜欢直接在 Date 上拓展,所以简单的写了个方法,名字是 oDate。
(注:其他时间格式暂不支持如:UTC、GMT 这种,如需可自行拓展)
先列出需要的几个方法:
function oDate() {}
function initialize() {} // 用来初始化
oDate.prototype.toString = function () {}; // 格式化日期时间
oDate.prototype.clearTime = function () {}; // 重置时分秒毫秒
oDate.now = function () {}; // 获取现在时间戳
oDate.today = function () {}; // 获取今天时间戳(重置时分秒毫秒)
先来说说比较重要的日期时间格式,需要怎么判定传进去的格式能拿到理想的格式。
看看日期时间都有什么组成,然后根据这个规律定义我们想要的格式
常用的时间:年月日 周几 上午|下午 时分秒(毫秒)月份
那么,我们可以根据这个规律,给每个添加固定格式:
yyyy // 年
MM // 月
dd // 日
dddd // 周几
TT // 上午|下午
hh // 时
mm // 分
ss // 秒
……
等等的格式,好了,那么,我们要转换格式的时候就可以这样组合:
yyyy MM dd TT hh mm ss fff dddd MMMM
当我们通过 toString 方法传上面的格式就能拿到我们想要的样子
// 2016 12 16 周五 上午 11 53 07 111
toString('yyyy MM dd TT hh mm ss fff dddd MMMM');
那么问题来了,我们怎么区分呢,日期时间里还要包含各种符号。
方案
我们可以用 replace()
例如
感觉非常简单,但是感觉很不直观,难道就这样结束了么?
能不能一个 replace() 搞定?
可以!上正则吧!(正则怎么学习,可以看小编另外的有关正则的文章 js-正则表达式)
不要太简单..那接下来怎么赋值呢,方法里面用 switch 不就好啦
就问你简不简单。
什么?你说还有没有别的方案?觉得这个正则太长看不懂
咱换种方式写,用 new RegExp match while switch
各位觉得,这三种写法,哪种更符合你们的预期要求呢?
代码总结
言归正传,继续我们今天的目的,封装函数,并可随时拓展。
其他功能不再深究如何实现,以下为完整代码:
使用方法:
// [2015-02-07 pm 11:32:03 Saturday]
console.log(oDate(1423323123123)
.toString('[yyyy-MM-dd tt hh:mm:ss dddd]'));
// [2018-04-08 Sunday]
console.log(oDate(1523126123123)
.toString('[yyyy-MM-dd dddd]'));
// [2011-11-24 pm 04 Thursday]
console.log(oDate(1322123523123)
.toString('[yyyy-MM-dd tt hh dddd]'));
// 2024-08-12 am 05:38 12]
console.log(oDate(1723412313123)
.toString('[yyyy-MM-dd tt hh:mm dd]'));
// [2015/11/11 AM 08:00:00 Wednesday]
console.log(oDate('2015-11-11')
.toString('[yyyy/MM/dd TT hh:mm:ss dddd]'));
// [2015年11月11日 13时01分00秒 11]
console.log(oDate('2015/11/11 13:01')
.toString('[yyyy年MM月dd日 HH时mm分ss秒 dd]'));
// [2015/11/11 PM 03:01:20 11]
console.log(oDate('2015-11-11 15:01:20')
.toString('[yyyy/MM/dd TT hh:mm:ss dd]'));
// [2015/11/11 20:11:30 Wednesday]
console.log(oDate('2015-11-11 20:11:30')
.toString('[yyyy/MM/dd HH:mm:ss dddd]'));
// [12-16-2016 pm 02:28:14(.548) Friday]
console.log(oDate(oDate.now())
.toString('[MM-dd-yyyy tt hh:mm:ss(.fff) dddd]'));
// [16-12-2016 Friday pm 02:28:14(.548) December Friday]
console.log(oDate(oDate.now())
.toString('[dd-MM-yyyy dddd tt hh:mm:ss(.fff) MMMM dddd]'));
// [2016-12-16 Friday PM 02:28:14(.549) December Friday]
console.log(oDate(oDate.now())
.toString('[yyyy-MM-dd dddd TT hh:mm:ss(.fff) MMMM dddd]'));
// [2016-12-16 Fri pm 02:28:14(.549) Dec Friday]
console.log(oDate(oDate.now())
.toString('[yyyy-MM-dd ddd tt hh:mm:ss(.fff) MMM dddd]'));
// [2016-12-16 Fri am 12:00:00(.000) Dec Friday]
oDate.today()
.toString('[yyyy-MM-dd ddd tt hh:mm:ss(.fff) MMM dddd]');
oDate().toString("yyyy-MM-dd") 方法的参数详细描述:
d:将日显示为不带前导零的数字,如 1
dd:将日显示为带前导零的数字,如 01
ddd:将日显示为缩写形式,如 Sun
dddd:将日显示为全名,如 Sunday
M:将月份显示为不带前导零的数字,如一月显示为 1
MM:将月份显示为带前导零的数字,如 01
MMM:将月份显示为缩写形式,如 Jan
MMMM:将月份显示为完整月份名,如 January
yy:以两位数字格式显示年份
yyyy:以四位数字格式显示年份
h:使用 12 小时制将小时显示为不带前导零的数字
hh:使用 12 小时制将小时显示为带前导零的数字
H:使用 24 小时制将小时显示为不带前导零的数字
HH:使用 24 小时制将小时显示为带前导零的数字
m:将分钟显示为不带前导零的数字
mm:将分钟显示为带前导零的数字
s:将秒显示为不带前导零的数字
ss:将秒显示为带前导零的数字
fff:以三位数毫秒
tt:显示am/pm
TT:显示AM/PM
oDate.now() 获取现在的完整时间戳
oDate.today() 获取今天时间戳(去掉时分秒毫秒 )
有人会说 tt TT 显示不正确,目前只对 12时进行划分,没有区分 凌晨 上午 中午 下午 晚上 这种情况,所以在 0点 到 0:59:59 的情况下, 显示的是 AM 12:59:59
这就当留给大家的作业吧,在 oDate 原基础上也可以很轻松拓展。
至于 基于源生 Date 上拓展 Date.prototype.format 也不阐述了,不喜欢这种写法。
源码链接地址:
http://orzcss.com/posts/681b44d5/#代码总结
本文内容均属个人原创作品,转载此文章须附上出处及原文链接。
加关注,定时推送,互动精彩多,若你有更好的见解,欢迎留言探讨!


还没有评论,来说两句吧...