关于工作中date的骚操作

158 阅读1分钟

1. 获取当前月份的前6个月

1.1 bug版本

初听此需求时, 心想如此简单的需求,岂不是分分钟搞定, 于是乎 30s 过后

const date = new Date();
const year = date.getFullYear();
const month = date.getMonth() + 1;
const arr = []
for (let i = 6; i >0; i--){
    arr.push(`${year}-${month - i}`)
}
console.log(arr); // ['2022--3', '2022--2', '2022--1', '2022-0', '2022-1', '2022-2']

好像不大对, 月份没有负数, 需要往前一年。那岂不是还要,判断月份是否 < 1, 然后改年份。如果往前 24个月, 岂不是很烦,作为一个能少写一行代码就少写一行代码的我而言。不能忍受

于是乎,我想到了小学数学: 除法

1.2 利用小学数学解决

function getMonths(time, offset = 6) {
    const date = new Date(time);
    let arr = [];
    let y = date.getFullYear();
    let m = date.getMonth() + 1;
    let all = y * 12 + m;

    for (let i = all - offset; i < all; i ++) {
        const year = Math.floor(i / 12);
        let month = (i % 12) + 1;
        month =  (month + '').replace(/^(\d)$/g, "0$1");
        arr.push(year + '-' + month)
    }
    return arr
}

getMonths('2019-5', 24);

2. 时间格式化

日常工作中, 时间戳转换为标注函数,非常常用。于是乎

接受一个 time, 和一个 config 配置, 利用正则。 不过呢,好像不是很实用 😳

function getTime(time, config = [
        {
          methods: 'getFullYear',
          splicing: '-',
          add: ''
        },
        {
          methods: 'getMonth',
          splicing: '-',
          add: 1
        },
        {
          methods: 'getDate',
          splicing: ' ',
          add: ''
        },
        {
          methods: 'getHours',
          splicing: ':',
          add: ''
        },
        {
          methods: 'getMinutes',
          splicing: ':',
          add: ''
        },
        {
          methods: 'getSeconds',
          splicing: '',
          add: ''
        }
      ]) {
      time = time * 1000
      let date = new Date(time)
      let target = ''
      config.forEach((item) => {
        target +=
          (date[item.methods]() + item.add + '').replace(/^(\d)$/, '0$1') +
          item.splicing
      })
      return target
    }

3. toLocaleString

初用此方法时,感觉特别好用. 后面的参数, 暂时没找到, 相对应的文档。不过大致猜测; 第一个参数: 对应语言的格式 第二参数: 额外的配置,可以设置 年月日分秒的格式,以及是否12时辰

new Date(1650271989000).toLocaleString('chinese',{hour12:false}) // '2022/4/18 16:53:09'

new Date(1650271989000).toLocaleString('chinese', { year: 'numeric', month: '2-digit', day: '2-digit',hour: '2-digit', minute: '2-digit', second: '2-digit',hour12: false}); // '2022/04/18 16:53:09'