date-fns 韩语(ko)语言包完整指南:format / parse / formatDistance 等全部快照行为详解
2026/9/19 22:05:23 网站建设 项目流程

date-fns 韩语(ko)语言包完整指南:format / parse / formatDistance 等全部快照行为详解

【免费下载链接】date-fns⏳ Modern JavaScript date utility library ⌛️项目地址: https://gitcode.com/gh_mirrors/da/date-fns

本指南以 date-fns 仓库中 韩语 locale 快照文档 为核心骨架,完整解析韩语(ko)语言包在formatparseformatDistanceformatDistanceStrictformatRelativeformatDuration六大 API 下的全部输出行为与规则,并结合 韩语 locale 实现源码 与快照生成脚本源码,说明每个输出结果背后的实现原理、序数词规则、时段时间段映射以及如何自己动手复现验证。读完本文,你将能够:准确预判韩语 locale 在各种日期时间 token 下的格式输出与解析回推结果;理解快照中每个字段(如 "1번째"、"약 6년"、"오후")的来源;掌握快照文档的生成与校验机制,并学会在业务代码中正确使用ko语言包。

快照文档是什么:ko locale 的行为基准

snapshot.md 不是手写文档,而是 date-fns 构建流程中由脚本自动生成的"行为快照":它对韩语 locale 的全部关键 API 输入一组固定的测试日期与 token,把真实运行结果以 Markdown 表格形式固化下来。生成逻辑位于 localeSnapshots 脚本:脚本枚举仓库中所有 locale(通过 listLocales.ts),逐个读取src/locale/<code>/index.ts导出对象,然后依次调用renderFormatParserenderFormatDistancerenderFormatDistanceStrictrenderFormatRelativerenderFormatDuration五个渲染函数,拼装后写入各 locale 目录下的snapshot.md

脚本对运行环境有硬性要求——TZ必须为utc(见 index.ts#L24-L25),因为快照中的日期字符串全部以Z结尾的 UTC ISO 格式呈现,任何非 UTC 时区都会导致输出偏差。脚本支持两种模式:默认generate模式把生成结果写回磁盘;test模式则比较磁盘上的快照与重新生成的结果,不一致即报错并提示运行pnpm run locale-snapshots。这意味着快照文档本身就是 ko locale 的回归测试基准:任何对韩语翻译或格式模板的改动,如果改变了输出,都会在test模式下被发现。

快照中每一行的parse结果同样由脚本实时计算(renderFormatParse/index.ts):先用format(date, token, { locale })得到格式串,再调用parse(formatResult, token, date, { locale })尝试回推,回推失败记作Errored。因此快照中"format 结果"与"parse 结果"天然构成一对可逆性验证。

快速上手:如何在项目中使用韩语 locale

在代码中引入韩语语言包即可让formatparseformatDistance等函数输出韩文:

import { format, parse, formatDistance } from "date-fns"; import { ko } from "date-fns/locale"; format(new Date(2019, 0, 11, 12, 13, 14), "MMMM do", { locale: ko }); // => "1월 11일" parse("1월 11일", "MMMM do", new Date(2019, 0, 1), { locale: ko }); // => 2019-01-11T00:00:00.000Z 附近的 Date formatDistance(new Date(2000, 5, 1), new Date(2000, 0, 1), { locale: ko }); // => "5개월"

ko对象定义在 pkgs/core/src/locale/ko/index.ts,包含五个必选字段与一个可选配置:

字段作用实现文件
code语言代码"ko"index.ts#L18
formatDistanceformatDistance/formatDistanceStrict使用的距离本地化函数_lib/formatDistance/index.ts
formatLongformat使用的长格式模板(P/PP/PPP/PPPPp/pp等)_lib/formatLong/index.ts
formatRelativeformatRelative使用的相对时间模板_lib/formatRelative/index.ts
localizeformat使用的各类值(序数、季度、月份、星期、时段)本地化_lib/localize/index.ts
matchparse使用的各类韩文文本匹配/解析规则_lib/match/index.ts
optionsweekStartsOn: 0(周日为一周第一天)、firstWeekContainsDate: 1index.ts#L24-L27

options两个值决定周相关计算:weekStartsOn: 0表示韩语语境下每周从周日开始,直接影响startOfWeekgetWeek等函数;firstWeekContainsDate: 1表示每年的第一周是包含 1 月 1 日的那一周。这正是快照中"Local week-numbering year"(Yo)与"Local week of year"(wo)的 parse 结果会回退到上一年 12 月末的原因(详见下文)。

formatparse:全部 token 输出速查表

快照的第一大节覆盖format/parse的 40 余种 token。下面按类别整理,format 列即韩语输出,parse 列是韩语文本回推得到的日期(UTC)。

年份(Calendar yearyo/ Local week-numbering yearYo

Token日期formatparse
yo1987-02-111987번째1987-01-01
yo0005-01-015번째0005-01-01
Yo1987-02-111987번째1986-12-28
Yo0005-01-015번째0004-12-26

韩语序数后缀统一为번째,实现见 localize 的 ordinalNumber。注意Yo的 parse 结果比输入日期"更早":因为周从周日开始且第一周包含 1 月 1 日,1987 年 2 月 11 日所在周的第一天是 1986-12-28(周日),这正是该周编号年的起点。

季度(Quarter formattingQ/ stand-aloneq

Tokenformat含义
Qo/qo1번째、2번째…序数季度
QQQ/qqqQ1、Q2…缩写季度
QQQQ/qqqq1분기、2분기…完整季度(wide)
QQQQQ/qqqqq1、2…窄格式

映射数据来自 localize 的 quarterValues:narrow: ["1","2","3","4"]abbreviated: ["Q1","Q2","Q3","Q4"]wide: ["1분기","2분기","3분기","4분기"]。格式化与独立两种宽度输出完全一致。

月份(Month formattingM/ stand-aloneL

Tokenformat 示例(1 月/12 月)说明
Mo/Lo1번째 / 12번째序数月份
MMM/LLL1월 / 12월缩写
MMMM/LLLL1월 / 12월完整(wide)
MMMMM/LLLLL1 / 12窄格式

韩语月份写作N월,abbreviated 与 wide 相同(见 monthValues)。parse 侧正则见 match 的 matchMonthPatterns:窄格式^(1[012]|[123456789])、缩写与完整格式^(1[012]|[123456789])월

星期(Day of week:E / i / e / c 四族)

韩语星期名称实现于 dayValues:일/월/화/수/목/금/토为窄/短/缩写,일요일…토요일为完整。快照中具体映射:

Token 族格式2019-02-11(周一)2019-02-15(周五)
E/EE/EEE/EEEEE/EEEEEE缩写/窄
EEEE完整월요일금요일
i(ISO)eo/co(本地序数)序数1번째/2번째5번째/6번째
iii/iiii/iiiii/iiiiii(ISO 缩写)同 E 族월 / 월요일금 / 금요일
eeeeeeee(本地缩写)同 E 族
cccccccc(独立缩写)同 E 族

io为 ISO 星期序数(周一到周日 = 1–7,2019-02-11 是周一故为 1번째);eo/co为本地序数(周日开始,周一排第 2、周五排第 6)。parse 侧星期匹配见 matchDayPatterns。

上下午与时段(AM/PMab,Flexible day periodB

韩语时段词全部定义于 dayPeriodValues / formattingDayPeriodValues:

韩语说明
am / pm오전 / 오후上下午
midnight / noon자정 / 정오午夜 / 正午
morning / afternoon / evening / night아침 / 오후 / 저녁 / 밤弹性时段

快照中的关键行为:

Token时间formatparse 结果
a(AM/PM)11:13 / 14:13 / 02:13오전 / 오후 / 오전00:00 / 12:00 / 00:00
b(AM/PM/noon/midnight)同上aa
B(flexible)11:13아침04:00
B14:13오후12:00
B19:13저녁17:00
B02:1300:00

a/b的 parse 会把 오전 归一到当日 00:00、오후 归一到 12:00;B的 parse 则按时段起点回推:아침→04:00、오후→12:00、저녁→17:00、밤→00:00。这些解析锚点由 match 的 parseDayPeriodPatterns 与 date-fns 时段框架共同决定。注意快照中b的 5 个宽度(b/bb/bbb/bbbb/bbbbb)输出相同,因为韩语在 narrow/abbreviated/wide 三档都使用同一组词。

小时 / 分钟 / 秒

Token含义format 示例
hoHour [1-12]11번째、23:13 时仍为 11번째
HoHour [0-23]11번째、23번째
KoHour [0-11]11번째(23:13 时也输出 11번째)
koHour [1-24]11번째、23번째
moMinute1 / 55(无后缀)
soSecond1 / 55(无后缀)

序数规则的精髓在 ordinalNumber 的 switch:minutesecond直接返回纯数字,date返回N일,其余(年、月、季度、星期、小时、日序)一律返回N번째。这就是为什么分钟秒数是1/55而小时是11번째date分支对应下文do(日序)。

日序与周序

Token日期formatparse
do(Day of month)2 月 1/11/28 日1일 / 11일 / 28일同日
do MMMM同上1일 2월 / 11일 2월 / 28일 2월同日
Do(Day of year)2019-02-1142번째2019-02-11
Do2019-12-31365번째2019-12-31
wo(Local week)2019-01-011번째2018-12-30
wo2019-12-0149번째2019-12-01
Io(ISO week)2019-01-011번째2018-12-31
Io2019-12-0148번째2019-11-25

do的 parse 回推与输入日期一致;wo的 parse 回退到该周第一天(周日),故 2019 年第 1 周回推为 2018-12-30;Io按 ISO 周规则回推到周一(2018-12-31 / 2019-11-25)。周序数在韩语中也使用번째,与N일形成对比,二者都源自同一个 ordinalNumber。

长日期 / 长时间 / 日期时间组合(P 族与 p 族)

长格式模板定义于 formatLong/index.ts:

const dateFormats = { full: "y년 M월 d일 EEEE", // PPPP long: "y년 M월 d일", // PPP medium: "y.MM.dd", // PP short: "y.MM.dd", // P }; const timeFormats = { full: "a H시 mm분 ss초 zzzz", // pppp long: "a H:mm:ss z", // ppp medium: "HH:mm:ss", // pp short: "HH:mm", // p };

快照中的实际输出:

Token示例输出
P/PP1987.01.11(短格式,含 1453-05-29 → 1453.05.29)
PPP1987년 1월 11일
PPPP1987년 1월 11일 일요일(含星期)
p12:13(HH:mm
pp12:13:14(HH:mm:ss
ppp오후 12:13:14 GMT+0
pppp오후 12시 13분 14초 GMT+00:00
Pp1987.01.11 12:13
PPpp1987.01.11 12:13:14
PPPppp/PPPPpppp完整日期 + 完整时间(含 오후 与 GMT 偏移)

一个值得注意的快照细节:pppppppPPPpppPPPPpppp这几行的parse 结果全部为Errored。原因在于时间模板中的z/zzzz(时区名 GMT+0 / GMT+00:00)在韩语match中没有对应的解析规则——match/index.ts 只实现了 ordinalNumber、era、quarter、month、day、dayPeriod 六类匹配器,不含时区解析,因此parse无法回推带时区名的完整时间格式。这是快照自动生成机制如实反映的实现边界,而非文档错误。

另外注意ppp오후 23:59:59 GMT+0这类输出:a H:mm:ss z模板中a在 23 点输出 오후(下午),时间本身仍按 24 小时制H显示,这是模板拼接的固有表现。

formatDistance:相对时间距离输出

快照第二节固定"now = 2000-01-01T00:00:00Z",考察formatDistance(date, baseDate, { locale: ko })。实现位于 formatDistance/index.ts,其核心是{{count}}占位符模板与后缀逻辑:

if (options?.addSuffix) { if (options.comparison && options.comparison > 0) { return result + " 후"; // 未来 } else { return result + " 전"; // 过去 } }

关键输出规律(节选,完整见 snapshot.md):

基准日期ResultincludeSeconds: trueaddSuffix: true
2006-01-01약 6년약 6년약 6년 후
2001-06-011년 이상1년 이상1년 이상 후
2000-06-015개월5개월5개월 후
2000-01-1514일14일14일 후
2000-01-01T00:00:251분 미만30초1분 미만 후
2000-01-01T00:00:151분 미만20초 미만1분 미만 후
2000-01-01T00:00:051분 미만10초 미만1분 미만 후
2000-01-01T00:00:001분 미만5초 미만1분 미만 전
1999-12-31T23:59:351분 미만30초1분 미만 전

可归纳出韩语 distance 的翻译策略:

  • 秒级:lessThanXSeconds{{count}}초 미만xSeconds{{count}}초halfAMinute→ 固定串30초
  • 分级近似:aboutXHours약 {{count}}시간aboutXMonths약 {{count}}개월aboutXYears약 {{count}}년
  • 超过整年:overXYears{{count}}년 이상
  • 后缀:未来加、过去加,且comparison > 0才视为未来(类型定义见 locale/types.ts)。

includeSeconds: true时 15–25 秒区间输出20초 미만/30초等更细粒度结果;addSuffix: true时后缀(후/전)总是追加在完整短语末尾。

formatDistanceStrict:精确距离与强制单位

第三节的基准同样为 2000-01-01T00:00:00Z,但输出不再做"약/이상"近似,而是精确到所选单位,并展示unit: "hour"强制小时的换算效果:

日期ResultaddSuffix: true强制 hour 单位
2006-01-016년6년 후52608시간
2001-06-011년1년 후12408시간
2000-06-015개월5개월 후3648시간
2000-01-1514일14일 후336시간
2000-01-01T00:00:2525초25초 후0시간
1999-12-31T23:59:3525초25초 전0시간
1999-12-31T23:00:001시간1시간 전1시간
1994-01-016년6년 전52584시간

要点:formatDistanceStrict默认按最接近的自然单位输出(如 45 分 45초 附近输出 45분,00:45 与 00:30 均输出 45분/30분);当传入unit: "hour"时一切换算为整小时(向下取整,如 25 秒 → 0시간)。所有单位词干与formatDistance共用同一份 formatDistanceLocale,只是不再使用약/이상修饰。

formatRelative:相对日期模板

第四节基准为 2000-01-01T00:00:00Z,输出由 formatRelative/index.ts 的模板决定:

const formatRelativeLocale = { lastWeek: "'지난' eeee p", yesterday: "'어제' p", today: "'오늘' p", tomorrow: "'내일' p", nextWeek: "'다음' eeee p", other: "P", };
日期Result
2000-01-102000.01.10(超过一周,回落到P短日期)
2000-01-05다음 수요일 00:00(下周三)
2000-01-02내일 00:00
2000-01-01오늘 00:00
1999-12-31어제 00:00
1999-12-27지난 월요일 00:00(上周一)
1999-12-211999.12.21(超过一周)

模板中的p使用formatLong的短时间格式HH:mm(故为 00:00),eeee输出完整星期名(수요일/월요일),'지난'/'다음'/'어제'/'오늘'/'내일'为韩语相对词,P即短日期y.MM.dd。超过一周的日期回落到普通日期格式。

formatDuration:Duration 对象格式化

最后一节覆盖formatDuration对 Duration 对象的输出,所有单位词干同样复用 formatDistanceLocale:

DurationResult
{"years":0}0년
{"years":2}2년
{"months":2}2개월
{"weeks":2}2주
{"days":2}2일
{"hours":2}2시간
{"minutes":2}2분
{"seconds":2}2초

韩语没有英语的复数形态变化,1주2주等单位词完全一致,仅数字变化,因此快照中0/1/2各值均可直接推导。

快照背后的实现原理与复现验证

序数后缀规则总结

从 ordinalNumber 可以提炼韩语序数三条规则,它解释了快照中几乎所有번째//纯数字的分布:

  1. minutesecond→ 纯数字(155);
  2. dateN일1일28일);
  3. 其余单位(year、quarter、month、week、day-of-week、day-of-year、hour)→N번째1987번째5개월属 distance 另行处理,11번째42번째等)。

localize的其余部分用buildLocalizeFn统一构建(pkgs/core/src/_lib/buildLocalizeFn/index.ts),通过valuesdefaultWidthargumentCallbackformattingValues等参数把上面看到的各 values 对象组装成format可直接调用的本地化函数。

match 层的解析边界

parse能否回推取决于 match/index.ts 是否覆盖对应 token:ordinalNumber/^(\d+)(일|번째)?/i匹配数字与可选后缀,dayPeriod支持 오전/오후/자정/정오/아침/저녁/밤,quarter支持Q1Q4N분기month/day支持N월N요일。凡不在此列的(如z/zzzz时区名),parse 即返回Errored——这正是快照中 ppp/pppp 行全部 Errored 的根因。

手动复现快照

快照由 localeSnapshots 脚本 生成,仓库包内提供了对应脚本命令。复现或校验韩语快照:

# 在 pkgs/core 包目录下 TZ=utc pnpm run locale-snapshots # 重新生成全部 locale 快照(含 ko/snapshot.md) TZ=utc pnpm run locale-snapshots test # 校验磁盘快照与重新生成结果一致

也可直接用 node 手动验证某个 token:

// 伪代码:TZ=utc 环境下 import { format } from "date-fns"; import { ko } from "date-fns/locale"; console.log(format(new Date("2019-02-11T12:13:14.015Z"), "EEEE", { locale: ko })); // 월요일

test模式的意义在于:任何对 ko locale 翻译文本或模板的改动,只要改变输出,就会让快照与生成结果不一致而构建失败——快照因此成为韩语语言包的"行为契约"。

结语

ko 快照文档 以 5 组表格完整刻画了韩语语言包在 format/parse、formatDistance、formatDistanceStrict、formatRelative、formatDuration 五大 API 下的全部行为。结合 localize、match、formatLong、formatRelative、formatDistance 五份源码,可以清晰还原每个输出的来源:序数后缀由ordinalNumber按单位分发,时段词由dayPeriodValues提供,长格式由formatLong模板拼接,时区时间无法解析则是match未实现时区规则的如实反映。若需为韩语场景开发或校验本地化行为,直接以本快照为基准、以pnpm run locale-snapshots test为回归手段即可。

附:ko locale 由 Hong Chulju、Lee Seoyoen、Taiki IKeda 三位贡献者维护(见 index.ts 的 JSDoc 标注)。

【免费下载链接】date-fns⏳ Modern JavaScript date utility library ⌛️项目地址: https://gitcode.com/gh_mirrors/da/date-fns

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询