快速开始
安装
历史版本请固定版本号安装:
bash
npm install @iefe/dateformat@2.0.1
# 或
yarn add @iefe/dateformat@2.0.1
# 或
pnpm add @iefe/dateformat@2.0.1引入
ESM:
js
import { format, getDays, getYearofDays, datefmt } from '@iefe/dateformat'CommonJS:
js
const { format, getDays, getYearofDays, datefmt } = require('@iefe/dateformat')浏览器(本版本起无 UMD 产物,请通过 ESM CDN 或打包工具):
html
<script type="module">
import { format, getDays } from 'https://unpkg.com/@iefe/dateformat@2.0.1/dist/index.js'
console.log(format()) // 当前时间 'YYYY-MM-DD hh:ii:ss'
console.log(getDays('2023-02')) // 28
</script>格式化:format 的三种调用形式
js
// 假设当前时间 2023-03-10 15:00:00(星期五)
format() // '2023-03-10 15:00:00'(默认模板)
format('YYYY-MM-DD') // '2023-03-10'(单参数视为模板)
format('-7', 'YYYY-MM-DD') // '2023-03-03'(偏移 + 模板)
format(' +3 ', 'MM-DD') // '03-13'(偏移字符串允许空格)
format('YYYY-MM-01') // '2023-03-01'(模板中的固定字符原样保留)非法输入不抛错:无法识别的参数按模板处理,模板中的非 Token 字符原样保留。
格式化"非今天"的日期
format 的基准恒为"今天 ± N 天"。要格式化一个给定的日期(如后端返回值), 本版本请借助 Builder 的 .base() 注入基准:
js
import { datefmt } from '@iefe/dateformat'
// 2024 年 2 月 29 日(注意 Date 构造器的月份是 0 基)
datefmt.create('YYYY-MM-DD').base(new Date(2024, 1, 29)).render() // '2024-02-29'
datefmt.create('Y年M月D日').base(new Date(2023, 2, 10)).render() // '二零二三年三月十日'TIP
2.1.0 起提供更直接的 formatDate('2024-02-29'), 支持日期字符串入参,无需手工构造 Date。
年月信息
js
import { getYearLastDays, getYearofDays, getDays } from '@iefe/dateformat'
// 假设今天是 2023-03-10(平年)
getDays() // 31(本月)
getDays('2023-02') // 28
getDays('2024-02') // 29
getYearofDays() // 365
getYearofDays(2024) // 366
getYearLastDays() // 296(今年剩余,不含今天)
getYearofDays() - getYearLastDays() // 69(今年已过去)三个方法无参时一律以"今天"为基准;非法入参回退默认值而非抛错。
TIP
本版本没有独立的 isLeapYear,判断闰年可用 getYearofDays(year) === 366; 2.1.0 起提供 isLeapYear(year)。
命名空间与 Builder(避免变量污染)
format、getDays 是前端最高频的命名之一,按名导入容易与业务代码或 date-fns 等库的同名导出冲突。本版本提供两种零污染用法:
1. 命名空间门面 — 只导入一个标识符
js
import { datefmt } from '@iefe/dateformat'
datefmt.format('-7', 'YYYY-MM-DD') // '2023-03-03'
datefmt.getDays('2024-02') // 29datefmt 经 Object.freeze 冻结,运行时改写或挂载任何属性都会抛 TypeError。 全部函数都收拢在 datefmt 上,与具名导出同源同行为。
2. 不可变建造者 — 链式配置,无共享可变状态
js
datefmt.create('YYYY-MM-DD hh:ii:ss') // 工厂方法:以模板创建建造者
.offset(-7) // 偏移 -7 天(可叠加)
.render() // '2023-03-03 15:00:00'
// 每一步都返回新实例,原实例与兄弟实例互不影响:
const today = datefmt.create('YYYY-MM-DD')
const lastWeek = today.offset(-7) // 新实例 → '2023-03-03'
const nextWeek = today.offset(7) // 新实例 → '2023-03-17'
today.render() // '2023-03-10'(原实例未被修改)pattern/offset/base均返回新实例;offset支持叠加(.offset(-7).offset('+3')净偏移-4)- 非法参数(如
.offset('abc'))忽略不抛错 render()延迟求值(调用时才读系统时间),toString()等价,可直接用于模板字符串`${builder}`
在框架中使用
Vue 3
vue
<script setup lang="ts">
import { ref } from 'vue'
import { format, getDays, datefmt } from '@iefe/dateformat'
const today = ref(format('YYYY年MM月DD日 a'))
const week = ref(format('今天EE'))
const monthDays = getDays()
const createdAt = datefmt.create('YYYY-MM-DD hh:ii').base(new Date(2024, 0, 1, 9, 30)).render()
</script>
<template>
<p>{{ today }}({{ week }}),本月共 {{ monthDays }} 天</p>
<p>创建于 {{ createdAt }}</p>
</template>React 18
tsx
import { useMemo } from 'react'
import { format, getDays, getYearLastDays } from '@iefe/dateformat'
export function Today() {
const text = useMemo(() => format('YYYY年MM月DD日 a'), [])
return (
<p>
{text},本月共 {getDays()} 天,今年还剩 {getYearLastDays()} 天
</p>
)
}已知限制
hh是 24 小时制、ii是分钟 — 与 dayjs/moment 的HH/mm语义不同,迁移时注意。- 本版本不支持
[方括号]字面量转义 — 模板中的独立字母a、i、s、H、Y、M、D都是 Token 会被替换(如模板'abc'中的a会变成时段),固定文案需拆分模板或字符串拼接 (见格式化 Token);2.1.0 起支持[方括号]转义。 - 没有
formatDate/parseDate/isValid/fromNow/diff/isToday等比较函数 /isLeapYear——这些在 2.1.0 中提供;本版本格式化任意日期用 Builder 的.base()。 - 仅使用运行环境本地时区,不做时区转换。
getDays只取年月、忽略日部分('2024-02-31'也返回29);月份越界的输入回退本月。- 偏移字符串仅平移日期、保留当天时分秒。
- 自迁移到 tsup 后不再提供 UMD 产物;浏览器请通过 ESM(
<script type="module">+ CDN)或打包工具使用。