Skip to content

日期 date

好用的日期库应当保持足够简洁的 api, 保证可读性, 性能. 从前端角度来讲,日期库最大的作用就是生成一个用户易读的文本,次要作用就是转化成一个后端容易接收的数据格式(通常是一个时间戳或者日期字符串)

TC39 有个提案Temporal, 是目前 Date 构造函数的替代, 这意味着,将来某个版本该库会被取缔,但是此刻此日期库仍然是最好的选择(之一)

快速使用

12345678
<template>
 <!-- 对此刻的日期默认使用yyyy-MM-dd格式化 -->
 <div>{{ date().format() }}</div>
</template>

<script lang="ts" setup>
import { date } from '@cat-kit/fe'
</script>

格式化 format

前端关于日期格式化最常用的 api

1234567891011121314
<template>
  <!-- 对此刻的日期默认使用yyyy-MM-dd格式化 -->
  <div>{{ date().format() }}</div>

  <!-- 可以传入一个日期, 日期对象, 时间戳或者由date()生成的对象 -->
  <div>{{ date('2022-02-14').format('yyyy/MM/dd')}}</div>
  <div>{{ date(1644796800000).format('yyyy/MM/dd')}}</div>
  <div>{{ date(1644796800000).format('yyyy-MM-dd hh:mm:ss')}}</div>
</template>

<script lang="ts" setup>
import { date } from '@cat-kit/fe'
</script>

格式化匹配器

matchers 是 date 所返回的构造函数上的一个静态属性,数据是一个对象, 对象的键是需要替换的格式化的文本, 同时也是 RegExp 构造函数的参数。大多数情况下你用不到这个 api。

默认的格式化匹配器

占位符描述示例
yyyy表示完整的年份2022
M表示月份M -> 9, MM -> 09
D表示日期D -> 9, DD -> 09
h小时(12 小时制)h -> 2, hh -> 02
H小时(24 小时制)H -> 9, HH -> 09, HH -> 14
mm -> 9, mm -> 09
ss -> 9, ss -> 09

你也可以自己添加格式化匹配器。

123456789101112131415161718
<template>
  <div>今天是周{{ date('2022-02-14').format('w')}}</div>
  <div>WeekDay:{{ date('2022-02-14').format('ww')}}</div>
</template>

<script lang="ts" setup>
import { date } from '@cat-kit/fe'

// 这是一个增加了周几替换的匹配器
date.setMatcher('w+', (date: Date, len: number) => {
  if (len === 1) {
    return '' + date.getDay()
  } else {
    return '0' + date.getDay()
  }
})
</script>

获取时间戳

时间戳是一个属性,在你第一次访问它时用原生 date 的 getTime()方法获取,后续的获取方式则直接是从缓存中获取。

12345678
<template>
<!-- 时间戳(毫秒) -->
{{(date().timestamp)}}
</template>

<script lang="ts" setup>
import { date } from '@cat-kit/fe'
</script>

日期计算

有时候,你需要计算相对某个时间的相对天数或者月数的日期,你可以使用 calc api.

12345678910111213141516
<template>
  <div>2022-02-14加上10天是: {{ d.calc(10, 'days').format() }}</div>

  <div>2022-02-14减去10天是: {{ d.calc(-10, 'days').format() }}</div>

  <div>2022-02-14加上1个月是: {{ d.calc(1, 'months').format() }}</div>

  <div>2022-02-14加上一个星期是: {{ d.calc(1, 'weeks').format() }}</div>
</template>

<script lang="ts" setup>
import { date } from '@cat-kit/fe'

const d = date('2022-02-14')
</script>

日期比较

如果你想知道两个日期之间差了多少天, 你可以使用 compare api

默认情况下compare函数传一个参数即另外一个日期时返回的是天数, 你也可以传入第二个参数, 该参数是一个函数, 改函数有三个参数year, month, day分别代表年月日

12345678910111213141516
<template>
  <div>2022-02-14 ~ 2022-03-14相差: {{date('2022-02-14').compare('2022-03-14')}}天</div>

  <div>到明年高考还有 {{date().compare(date(`${date().year + 1}-06-07`))}} 天</div>

  <div>2022-02-14 ~ 2025-03-10相差: {{dis}}</div>
</template>

<script lang="ts" setup>
import { date } from '@cat-kit/fe'

// 可以使用第二个参数来达到更加个性化的需求
const dis = date('2022-02-14').compare('2025-03-10', (y, m, d) => {
  return `${y}年${m}个月${d}天`
})
</script>

跳转至月末

有时候你想要获取某个月一共有多少天, 你可以进行月份跳转

也许做万年历的时候挺有用的

123456789101112131415
<template>
  <!-- 31 -->
  <div>2022-10这个月的最后一天是: {{ date('2022-10').toEndOfMonth().day }}</div>
  <div>2022-10-15这个月的最后一天是:{{ date('2022-10-15').toEndOfMonth().day }}</div>

  <div>本月最后一天是: {{ date().toEndOfMonth().day }}</div>
  <div>10个月后的最后一天是: {{ date().toEndOfMonth(10).day }}</div>

  <div>3个月前的最后一天是: {{ date().calc(-3, 'months').toEndOfMonth().day }}</div>
</template>

<script lang="ts" setup>
import { date } from '@cat-kit/fe'
</script>

获取年月日时分秒

提供了年月日时分秒的快捷写法

处理了月份从 0 开始的问题

12345678910111213141516171819202122
<template>
  <div>
    {{ d.year }} 年 {{ d.month }} 月 {{ d.day }} 日 {{ d.hour }} 时
    {{ d.minute }} 分 {{ d.second }} 秒
  </div>
</template>

<script lang="ts" setup>
import { date } from '@cat-kit/fe'
import { onBeforeUnmount, shallowRef } from 'vue'

let d = shallowRef(date())

let timer = setInterval(() => {
  d.value = date()
}, 1000)

onBeforeUnmount(() => {
  clearInterval(timer)
})
</script>

反向格式化

根据提供的被格式化的数据和格式化字符串来反推日期

1234567891011
<template>
  <div>
    <div>{{ date.from('20230727', 'yyyyMMdd').format('yyyy-MM-dd') }}</div>
    <div>{{ date.from('2023^07^27', 'YYYY^MM^dd').format('yyyy-MM-dd') }}</div>
  </div>
</template>

<script lang="ts" setup>
import { date } from '@cat-kit/fe'
</script>

插件

一个插件就是一个函数, 该函数接受一个 Date 上下文参数, 可以用来设置匹配器等等 虽然可以直接操作 Dater 的 api,但可以使用插件机制来更好的组织你的代码

123456789101112131415161718192021222324
<template>
  <div>
    今天是 {{date().format('ww')}}
  </div>
  <div>
    今天是 {{date().format('WW')}}
  </div>
</template>

<script lang="ts" setup>
import { date, type Dater } from '@cat-kit/fe'

const pluginMatcher = (dater: typeof Dater) => {
  dater.setMatcher('w+', (date: Date, len: number) => {
    return '周' + date.getDay()
  })
  dater.setMatcher('W+', (date: Date, len: number) => {
    return '星期' + date.getDay()
  })
}

date.use(pluginMatcher)
</script>

MIT Licensed