JS中Date()对象的操作---返回两位月份

需求描述

最近在做微信小程序,虽然说微信公众号开发已经搁置了,但是还是要造作嘛,闲言少叙,开始正题。

需求很简单,返回一个两位数的月份,就是下面这些:

01,02,03,04,05,06,07,08,09,10,12

对于很多 JSer 来说,取得月份有什么难的啊,最不济我们还有moment神器嘛,但是还是练习并且记录一下吧 ^_^

let today = new Date()
// 因为getMonth是从 0 开始,到11结束
let todayMonth = today.getMonth() + 1  

但是这样返回的月份,前面的九个月是一位数,后面的3个月就是两位数了。。。排版起来恐怕不是那么的爽。

解决方案

在看沪江的微信小程序的教程中,我看到了他们的实现方式很有意思

let today = new Date()
let todayMonth = (‘0’ + today.getMonth() + 1).slice(-2)

解决方案很优雅嘛,当然或许是我见识少的缘故(其实在以前也是见过类似的实现方式的,不过真的忘掉了)

首先接着上面的思路:

  1. getMonth()返回的月份数是从0开始到11结束
  2. getMonth() + 1返回从1到12月正确的月份
  3. ‘0’ + (getMonth() + 1) 返回的是从01到012的字符串
  4. 然后使用slice()方法,截取字符串的末尾两个字符,刚好就是符合要求的月份

知识补充

  1. Arraty.prototype.slice()
    • slice() 方法返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新的数组中,原始的数组不会被修改,不是变异方法
  2. String.protoType.slice()

    • slice() 方法提取一个字符串的一部分,并返回一个新的字符串

有啥异同?

相同点:
  1. 不管是字符串的slice方法还是数组的slice方法,都是截取原来的一段,但是不会改变原来的对象,不属于变异方法。
  2. 都可以接收两个参数,而且第二个参数都是可选的。不传入第二个参数的话,默认是从开始位置开始到末尾。
  3. 如果传入的参数为负数的时候,表示从数组的末尾开始数,例如 slice(-2,-1)只会取到数组的倒数第二个元素,字符串的倒数第二个字符
不同点

附带原始日期字符串格式化函数(来自沪江微信小程序教程)

/*
  * 将原始日期字符串格式化 '2017-06-12'
  * return '今日' / 08-21 / 2017-06-12
  */
dateConvert(dateStr) {
    if (!dateStr) {
      return ''
    }
    let today = new Date()
    let todayYear = today.getFullYear()
    console.log(`todayYear:${todayYear}`)
    let todayMonth = ('0' + (today.getMonth() + 1)).slice(-2)
    let todayDay = ('0' + today.getDay()).slice(-2)
    let convertStr = ''
    let originYear = +dateStr.slice(0, 4)
    let todayFormat = `${todayYear}-${todayMonth}-${todayDay}`
    if (dateStr === todayFormat) {
      convertStr = '今日'
    } else if (originYear < todayYear) {
      let splitStr = dateStr.split('-')
      convertStr = `${splitStr[0]}年${splitStr[1]}月${splitStr[2]}日`
    } else {
      convertStr = dateStr.slice(5).replace('-', '月') + '日'
    }
    return convertStr
  }

Table of Contents