Locale 完整指南:format、parse 与 formatDistance 全量 Token 行为速查)
date-fns 荷兰语nlLocale 完整指南format、parse 与 formatDistance 全量 Token 行为速查【免费下载链接】date-fns⏳ Modern JavaScript date utility library ⌛️项目地址: https://gitcode.com/gh_mirrors/da/date-fns本指南以 date-fns 仓库中 荷兰语 locale 快照文档 为主体系统梳理荷兰语Dutch,nl区域设置在format、parse、formatDistance、formatDistanceStrict、formatRelative、formatDuration六个 API 下的全部格式化 Token 行为。通过对照 locale 实现源码 与快照生成脚本你将掌握荷兰语序数词后缀e、缩写月份/星期、灵活时段s ochtends等等语言特性以及如何在业务代码中正确接入nllocale 并避开 parse 时区类 Token 的已知错误。荷兰语 Locale 的定位与快照文档的由来在 date-fns 中每个语言locale都是一组按统一接口组织的本地化数据包含formatDistance、formatLong、formatRelative、localize、match与周起始日等options。荷兰语 locale 的入口定义在 pkgs/core/src/locale/nl/index.ts其code: nl对应 ISO 639-1 语言代码同时文档注释标注了 ISO 639-2 代码nld。snapshot.md并非手写文档而是由构建脚本自动生成的行为快照。脚本 pkgs/core/scripts/build/localeSnapshots/index.ts 会遍历所有 locale调用各渲染器生成 Markdown 快照并写入每个 locale 目录。脚本要求以TZutc运行否则直接抛出错误快照内容由renderFormatParse、renderFormatDistance、renderFormatDistanceStrict、renderFormatRelative、renderFormatDuration五个渲染器拼接而成。因此本文档中的每一行结果都对应真实的引擎执行输出可作为开发时的权威行为参考。仓库内共维护 95 个语言含地区变体的同构快照文件如 locale/af/snapshot.md、locale/de/snapshot.md荷兰语是其中之一。如何在自己的项目中启用荷兰语 Locale1. 通过locale选项传入date-fns 的format、parse、formatDistance等函数都接受可选的locale选项。以 官方 i18n 文档 的用法为例import { format } from date-fns; import { nl } from date-fns/locale; format(new Date(1987, 1, 11), PPPP, { locale: nl }); // woensdag 11 februari 1987多语言站点可以按需动态选择import { format } from date-fns; import { enGB, nl, ru } from date-fns/locale; const locales { en: enGB, nl: nl, ru: ru }; format(date, P, { locale: locales[window.__localeId__] });2. 通过全局默认选项设置如果应用整体使用荷兰语可以借助setDefaultOptions将nl设为默认 locale之后所有函数无需再传locale参数参考 setDefaultOptions 源码。3. 荷兰语 locale 的默认周配置从 nl/index.ts 可以看到options: { weekStartsOn: 1 /* Monday */, firstWeekContainsDate: 4, },即荷兰语环境下每周从周一开始且一年中的第一周包含该年 1 月 4 日ISO 8601 周编号规则。这与getWeek、setWeek、differenceInCalendarWeeks等周相关函数的计算结果直接相关也是快照中 Local week of yearwo与 ISO week of yearIo输出一致的原因——荷兰语周制本身即采用 ISO 周规则。format与parseToken 全量行为对照快照的第一部分覆盖了format/parse双方向的全部 Token。format结果列展示给定日期经 token 格式化后的文本parse结果列展示将该文本反解析得到的日期默认落在 2000 年附近或由 token 决定Errored表示该 Token 的格式字符串无法被parse反向解析。下表按类别完整收录。年份、季度与月份Token含义format 示例parse 结果yo日历年份序数1987e/5e1987-01-01 / 0005-01-01Yo本地周年序数1987e/4e1986-12-29 / 0003-12-29Qo季度formatting序数1e/2e2019-01-01 / 2019-04-01QQQ季度缩写K1/K22019-01-01 / 2019-04-01QQQQ季度全称1e kwartaal/2e kwartaal2019-01-01 / 2019-04-01QQQQQ季度窄格式1/22019-01-01 / 2019-04-01qo/qqq/qqqq/qqqqq季度stand-alone行为与 Q 系列一致同上同上Mo月份序数1e…12e2019-01-01…2019-12-01MMM月份缩写jan.feb.mrt.apr.meijun.jul.aug.sep.okt.nov.dec.对应月份 1 日MMMM月份全称januarifebruarimaartaprilmeijunijuliaugustusseptemberoktobernovemberdecember对应月份 1 日MMMMM月份窄格式JFMAMJJASOND见下方解析歧义说明Lo/LLL/LLLL/LLLLL月份stand-alone文本与 M 系列完全一致同上同上注意MMMMM的窄格式仅取首字母M同时代表三月maart与五月meiJ同时代表一月、六月、七月A同时代表四月与八月。快照中parse结果显示出明显的歧义五月M被解析回三月六月/七月J被解析回一月。因此窄格式月份不可用于可靠的反向解析这是窄格式的固有歧义并非 bug。月份缩写与全称定义在 localize/index.ts注意荷兰语mei五月缩写与全称相同没有句点后缀其余月份缩写均带.。年份的序数后缀e由 localize 中的 ordinalNumber 统一生成任何数字直接拼接e1987e、1e、12e这是荷兰语序数词eerste、tweede……的简化数字形式的规则化表达。周数与日期Token含义format 示例parse 结果wo本地周序数1e2019-01-01/48e2019-12-012018-12-31 / 2019-11-25IoISO 周序数同上同上do日序数1e11e28e同日 00:00do MMMM日 月份全称组合1e februari等同日Do年内第几天序数42e/365e2019-02-11 / 2019-12-31E/EE/EEE星期缩写maavri当日EEEE星期全称maandagvrijdag当日EEEEE星期窄格式MV当日EEEEEE星期短格式mavr当日io/iii/iiii/iiiii/iiiiiiISO 星期数字/缩写/全称/窄/短与 E 系列文本相同当日eo/eee/eeee/eeeee/eeeeee本地星期数字/缩写/全称/窄/短与 E 系列文本相同当日co/ccc/cccc/ccccc/cccccc本地星期stand-alone与 E 系列文本相同当日星期文本的五档宽度定义在 localize/index.ts窄格式ZMDWDVZ存在 zondag/zaterdag 同为 Z、dinsdag/donderdag 同为 D 的歧义短格式zomadiwodovrza缩写zonmaadinwoedonvrizat全称zondagmaandagdinsdagwoensdagdonderdagvrijdagzaterdag注意缩写与短格式的差异仅体现在首字母数量上如maavsma这与EEEEEE输出ma/vr、EEE输出maa/vri的快照结果一一对应。时段AM/PM、中午、午夜与弹性时段Token含义format 示例11:13 / 14:13 / 19:13 / 02:13a/aa/aaaa/aaaaaAM/PMAM/PMaaa/bbbAM/PM 小写am/pmb/bb/bbbb/bbbbbAM/PM/中午/午夜荷兰语未区分仍为AM/PMB/BB/BBB/BBBB/BBBBB弹性时段Flexible day periods ochtends上午04:00/s middags下午12:00/s avonds晚上17:00/s nachts夜间00:00弹性时段是荷兰语 locale 的一大特色B系列根据一天中的时刻输出带撇号的惯用表达s ochtends、s middags、s avonds、s nachts对应源码中 dayPeriodValues 的morning/afternoon/evening/night定义。而b系列AM/PM/中午/午夜在荷兰语中没有专门的词汇区分因此统一回退为AM/PM。parse 方向对B系列的解析结果为 04:00/12:00/17:00/00:00 这些时段的起始时刻。小时、分钟与秒Token含义format 示例ho小时 [1-12]序数11e11:13 与 23:13 均输出 11eHo小时 [0-23]序数11e/23eKo小时 [0-11]序数11eko小时 [1-24]序数11e/23emo分钟序数1e/55eso秒序数1e/55e所有时间单位都使用序数形式并附加e后缀parse 方向可正确还原到对应时刻如55e解析为 :55:00。本地化长日期/长时间P系列与日期时间组合Tokenformat 示例parseP11-01-1987dd-MM-yyyy零填充成功PP11 jan. 1987成功PPP11 januari 1987成功PPPPzondag 11 januari 1987星期 日 月 年成功p12:13成功pp12:13:14成功ppp12:13:14 GMT0Erroredpppp12:13:14 GMT00:00ErroredPp11-01-1987, 12:13成功PPpp11 jan. 1987, 12:13:14成功PPPppp11 januari 1987 om 12:13:14 GMT0ErroredPPPPppppzondag 11 januari 1987 om 12:13:14 GMT00:00Errored这些格式由 formatLong/index.ts 定义const dateFormats { full: EEEE d MMMM y, long: d MMMM y, medium: d MMM y, short: dd-MM-y, }; const timeFormats { full: HH:mm:ss zzzz, long: HH:mm:ss z, medium: HH:mm:ss, short: HH:mm, }; const dateTimeFormats { full: {{date}} om {{time}}, long: {{date}} om {{time}}, medium: {{date}}, {{time}}, short: {{date}}, {{time}}, };由此可解释快照中的三个关键细节P系列输出dd-MM-y的零填充短日期如11-01-1987而PPPP输出完整星期全称日期时间组合在 full/long 宽度使用荷兰语连接词om意为at/在medium/short 宽度则用逗号,分隔含时区 Tokenz/zzzz的ppp、pppp以及含它们的组合PPPppp、PPPPpppp在parse方向一律返回Errored——date-fns 的parse不支持z/zzzz时区格式串。因此涉及ppp/pppp的格式只应用于展示不能用于parse反向解析。formatDistance相对时间间隔的荷兰语表达快照第二部分以现在为 2000-01-01 00:00UTC为基准覆盖未来over ...与过去... geleden两个方向。要点includeSeconds: true时不足 1 分钟的差值会细分25s →een halve minuut、15s →minder dan 20 seconden、5s →minder dan 10 seconden、0s →minder dan 5 seconden不开启时统一为minder dan een minuut。addSuffix: true时未来时间前缀over如over 5 maanden过去时间后缀geleden如15 minuten geleden差值恰为 0 时输出minder dan een minuut geleden。荷兰语的复数/单数形态区分明显1 dag/2 dagen、1 maand/2 maanden、een minuut/2 minuten、1 jaar/5 jaarjaar 单复数同形、ongeveer 6 jaar等。上述规则在 formatDistance/index.ts 中实现当count 1时取one文案否则把{{count}}替换进other文案addSuffix开启时comparison 0未来加over前缀否则加geleden后缀。文案表共 16 组 token覆盖lessThanXSeconds、xSeconds、halfAMinute、xMinutes、aboutXHours、xDays、aboutXWeeks、xMonths、aboutXYears、overXYears、almostXYears等全部刻度。formatDistanceStrict无四舍五入的精确间隔该部分同样以 2000-01-01 00:00 为基准但不使用近似表达ongeveer直接给出单位与整数数值1 分钟以上按最接近的整数单位输出45 minuten、25 seconden、1 uur等。addSuffix: true同样输出over .../... geleden。最后一列强制单位展示了传入{ unit: hour }时把差值换算为小时的结果52608 uur、43848 uur、24 uur等用于精确到小时级的展示需求例如formatDistanceStrict(date, base, { unit: hour, addSuffix: true })。formatRelative相对日期的本地化表达以现在为 2000-01-01 00:00 时各相对日期输出为DateResult2000-01-109 天后10-01-2000超出本周/下周范围回退为P2000-01-05本周内未来woensdag om 00:002000-01-02morgen om 00:002000-01-01vandaag om 00:001999-12-31gisteren om 00:001999-12-27上周内afgelopen maandag om 00:001999-12-219 天前21-12-1999实现位于 formatRelative/index.ts模板如下const formatRelativeLocale { lastWeek: afgelopen eeee om p, yesterday: gisteren om p, today: vandaag om p, tomorrow: morgen om p, nextWeek: eeee om p, other: P, };可见荷兰语习惯今天/明天/昨天分别用vandaag/morgen/gisteren上周的星期用afgelopen过去的 星期全称本周未来的星期直接输出星期全称超出上周/下周窗口的日期则回退为Pdd-MM-y。由于模板中pHH:mm是 24 小时制所以00:00表示午夜时刻。formatDurationDuration 对象的本地化输出快照最后一部分覆盖formatDuration对Duration对象各字段years/months/weeks/days/hours/minutes/seconds的单数与复数表达{years:1}→1 jaar{years:2}→2 jaarjaar 单复数同形{months:1}→1 maand{months:2}→2 maanden{weeks:1}→1 week{weeks:2}→2 weken{days:1}→1 dag{days:2}→2 dagen{hours:1}→1 uur{hours:2}→2 uuruur 单复数同形{minutes:1}→een minuut{minutes:2}→2 minuten{seconds:1}→1 seconde{seconds:2}→2 seconden各字段为 0 时输出0 jaar/0 maanden/0 weken/0 dagen/0 uur/0 minuten/0 seconden可见formatDuration复用了 formatDistance 文案表 中xYears、xMonths、xWeeks、xDays、xHours、xMinutes、xSeconds的one/other分支因此单复数规则与formatDistance完全一致。源码级佐证快照背后的构建与测试体系快照生成运行TZutc pnpm run locale-snapshotsgenerate 模式会重写全部 95 个 locale 的 snapshot.mdtest模式则校验磁盘文件与生成结果一致不一致会抛出 Please run pnpm run locale-snapshots and commit the results 的错误提示具体见 localeSnapshots/index.ts。解析模式match/index.ts 定义了反向解析用的正则例如月份匹配^(jan.|feb.|mrt.|apr.|mei|jun.|jul.|aug.|sep.|okt.|nov.|dec.)与全称^(januari|februari|...)星期匹配^(zondag|maandag|...)序数匹配^(\d)e?parse结果正是这些正则与 localize 数据 协同作用的产物。类型与接口所有 locale 字段formatDistance、formatLong、formatRelative、localize、match、options均受 src/types.ts 中Locale类型约束任何缺少字段的 locale 在编译期即报错保证了快照结构的统一性。快速参考荷兰语格式化 Token 速查表类别Token说明序数后缀任意数字一律追加e1e、2e、12e、1987e月份缩写MMM/LLLjan.feb.mrt.apr.meijun.jul.aug.sep.okt.nov.dec.月份全称MMMM/LLLLjanuari…december月份窄格式MMMMM/LLLLLJFMAMJJASOND解析歧义星期缩写EEE/iii/eee/cccmaadinwoedonvrizatzon星期全称EEEE/iiii/eeee/ccccmaandag…zondag星期短格式EEEEEE/iiiiii/eeeeee/cccccczomadiwodovrza弹性时段B系列s ochtends/s middags/s avonds/s nachts日期格式P→PPPPdd-MM-y→EEEE d MMMM y时间格式p→ppppHH:mm→HH:mm:ss zzzz日期时间Pp→PPPPpppp组合模板{{date}} om {{time}}full/long、{{date}}, {{time}}medium/short相对时间formatDistance未来over ...过去... geleden精确间隔formatDistanceStrict支持unit强制单位如hour→X uur相对日期formatRelativevandaag om/morgen om/gisteren om/afgelopen eeee om时长formatDuration复用 distance 单复数文案常见问题与注意事项parse无法解析带时区的格式所有含z/zzzz的输出ppp、pppp、PPPppp、PPPPpppp在 parse 方向均报Errored这类格式只能用于展示。窄格式存在歧义MMMMM的单字母月份如M、J、A与EEEEE的单字母星期在 parse 时可能解析到错误的月份/星期建议仅用于空间受限的展示场景。周制差异荷兰语 locale 使用weekStartsOn: 1周一与firstWeekContainsDate: 4ISO 规则若业务按美国习惯周日为一周开始计算周数需显式传入weekStartsOn选项或在初始化时配置setDefaultOptions。月份mei无缩写点五月在缩写与全称中都是mei这是荷兰语固有拼写与jan.、feb.等带句点形式不同。快照以 UTC 为基准快照中的 parse 日期时间如1987-01-11T00:00:00.000Z在TZutc环境下生成在实际业务时区中format输出的本地时间字段可能不同测试时请留意时区设置快照脚本 对此有强制约束。通过本文的 Token 行为对照与源码佐证你可以在不运行程序的情况下准确预判nllocale 在各 API 下的输出并安全地将其接入生产环境。【免费下载链接】date-fns⏳ Modern JavaScript date utility library ⌛️项目地址: https://gitcode.com/gh_mirrors/da/date-fns创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考