概序
前段时间, 朋友叫我把new Date
的功能扩展一下,我说网上不是有一堆么,他说太复杂了,让我搞个简单点的。
憋了半天,发现简单不起来啊,只能搞个简化版的出来。
目前常用功能有这样几个:获取现在时间戳、获取今天时间戳、获取周、月、am、pm、任意格式化时间。
因为不喜欢直接在 Date 上拓展,所以简单的写了个方法,名字是 oDate。
(注:其他时间格式暂不支持如:UTC、GMT 这种,如需可自行拓展)
先列出需要的几个方法:
1 | function oDate() {} |
先来说说比较重要的日期时间格式,需要怎么判定传进去的格式能拿到理想的格式。
看看日期时间都有什么组成,然后根据这个规律定义我们想要的格式
常用的时间:年月日 周几 上午|下午 时分秒(毫秒)月份
那么,我们可以根据这个规律,给每个添加固定格式:
- 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()
例如
1 | var dayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; |
感觉非常简单,但是感觉很不直观,难道就这样结束了么?
能不能一个 replace()
搞定?
可以!上正则吧!(正则怎么学习,可以看小编另外的有关正则的文章)
1 | var now = new Date(); |
不要太简单..那接下来怎么赋值呢,方法里面用 switch 不就好啦
1 | (function () { |
就问你简不简单。
什么?你说还有没有别的方案?觉得这个正则太长看不懂
咱换种方式写,用 new RegExp
match
while
switch
1 | (function () { |
各位觉得,这三种写法,哪种更符合你们的预期要求呢?
代码总结
言归正传,继续我们今天的目的,封装函数,并可随时拓展。
其他功能不再深究如何实现,以下为完整代码:
1 | var oDate = (function (Date, Math, Array, undefined) { |
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 也不阐述了,不喜欢这种写法。
关注 web翎云阁,定时推送,互动精彩多,若你有更好的见解,欢迎留言探讨!
本作品采用 知识共享署名 3.0 中国大陆许可协议 进行许可,分享、演绎需署名且使用相同方式共享。转载请务必保留本页网址和作者信息,否则即为侵权。