metroluffy / blog

用于记录平时开发中所遇到问题的解决方法、笔记等
9 stars 1 forks source link

一个JS的时间格式化函数 #13

Open metroluffy opened 6 years ago

metroluffy commented 6 years ago

类似于PHP的时间格式化函数,传入时间字符串或时间戳以及想要的格式,例如

give: format('2018/06/28 14:58:23', 'yy-mm-dd')
get: 2018-06-28
/*  时间格式化函数
     *  date   @String js支持的合格的时间字符串
     *  format @String 期望返回的时间格式,yy-mm-dd-hh-min-ss-ms ww
     *  zh     @Boolean 星期格式是否中文
     */
    format (date, format, zh = true) {
      const weeks = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
      const weeksEn = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
      if (this.isValidDate(date)) {
        // 对IOS时间字符串的处理
        if (typeof date !== 'number') {
          date = date.replace(/-/g,"/")
        }
        const t = new Date(date)
        let f = String(format)
        if (new RegExp('yy', 'g').test(f)) {
          f = f.replace(/yy/g, t.getFullYear())
        }
        if (new RegExp('mm', 'gi').test(f)) {
          let m = t.getMonth() + 1
          f = f.replace(/mm/g, m < 10 ? '0' + m : m)
        }
        if (new RegExp('dd', 'gi').test(f)) {
          let d = t.getDate()
          f = f.replace(/dd/g, d < 10 ? '0' + d : d)
        }
        if (new RegExp('hh', 'gi').test(f)) {
          f = f.replace(/hh/g, t.getHours())
        }
        if (new RegExp('min', 'gi').test(f)) {
          f = f.replace(/min/g, t.getMinutes())
        }
        if (new RegExp('ss', 'gi').test(f)) {
          f = f.replace(/ss/g, t.getSeconds())
        }
        if (new RegExp('ms', 'gi').test(f)) {
          f = f.replace(/ms/g, t.getMilliseconds())
        }
        if (new RegExp('ww', 'gi').test(f)) {
          f = f.replace(/ww/g, zh ? weeks[t.getDay() - 1] : weeksEn[t.getDay() - 1])
        }
        return f
      } else {
        console.error('Invalid Date,Are you sure that the time you give is the correct format?')
        return date
      }
    },
    isValidDate (d) {
      // 对IOS时间字符串的处理,IOS上只支持yyyy/MM/dd这种标准格式,如果是 '2011-07-14 19:43:37' 这 
     // 种格式会报Invalid Date
     // 实际上把时间字符串转成`2011-07-14T19:43:37`这种格式也行
    // http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a003169814.htm
      if (typeof d !== 'number') {
        d = d.replace(/-/g,"/")
      }
      return d instanceof Date || !isNaN(new Date(d).getDate())
    }