date-fns 马其顿语(mk)locale 完整参考:format/parse 令牌、距离与相对时间的本地化实现

发布时间:2026/9/19 20:36:13
date-fns 马其顿语(mk)locale 完整参考:format/parse 令牌、距离与相对时间的本地化实现
date-fns 马其顿语mklocale 完整参考format/parse 令牌、距离与相对时间的本地化实现【免费下载链接】date-fns⏳ Modern JavaScript date utility library ⌛️项目地址: https://gitcode.com/gh_mirrors/da/date-fns本篇以 date-fns 仓库中的 马其顿语 locale 快照文档 为主体结合mklocale 的完整源码实现系统梳理马其顿语在 date-fns 中格式化format、解析parse、距离表达formatDistance / formatDistanceStrict、相对时间formatRelative与时长格式化formatDuration的全部本地化行为。读完本文你将掌握mklocale 的全部令牌输出、序数词规则、解析边界与实现文件对应关系可直接用于多语言项目的时间显示与回填解析。snapshot.md 是什么locale 的“活文档”在 date-fns 中每个语言包目录下都有一份snapshot.md它是一份由真实运行结果生成的快照以固定日期为输入逐一记录format、parse、formatDistance、formatDistanceStrict、formatRelative、formatDuration的输出。因此它既是开发者的速查手册也是回归测试的行为基线——任何对 locale 数据的修改都会反映到这份快照中。mk目录的完整结构如下pkgs/core/src/locale/mk文件/目录职责index.ts汇总并导出mk: Locale对象定义语言代码与周起始选项_lib/formatDistance/index.ts距离表达词表与后缀逻辑за / пред_lib/formatLong/index.ts长格式P/PP/PPP/PPPP、p/pp/ppp/pppp模板_lib/formatRelative/index.ts相对时间模板вчера / денес / утре 等_lib/localize/index.ts序数词、纪元、季度、月份、星期、时段的本土化值_lib/match/index.ts上述值的正则匹配与解析模式snapshot.md全部行为的运行快照Locale接口pkgs/core/src/locale/types.ts要求每个 locale 提供code、formatDistance、formatRelative、localize、formatLong、match六项能力mk正是按此结构组织的。mk locale 的全局配置index.ts中导出的mk对象定义了关键选项export const mk: Locale { code: mk, formatDistance: formatDistance, formatLong: formatLong, formatRelative: formatRelative, localize: localize, match: match, options: { weekStartsOn: 1 /* Monday */, firstWeekContainsDate: 4, }, };两个选项直接决定快照中Yo、wo、Io等“本地周/ISO 周”令牌的边界行为weekStartsOn: 1每周从周一开始这是马其顿的通用习惯firstWeekContainsDate: 4一年中的第一周必须包含 1 月 4 日ISO 8601 同款规则。正因为如此快照中 1987-02-11 的本地周编号年Yo解析结果是1986-12-29周一而非该日所在公历年0005-01-01 解析为 0003-12-29即“本地周编号年”可以从公历年前一年开始。format 与 parse全部令牌行为详解快照第一部分以format输出与parse回填两列并置展示了同一日期文本能否被parse无损还原。以下按类别列出完整令牌数据输入日期均含12:13:14.015Z时间部分parse结果列是该文本解析回的时间戳。年份Calendar yearyo与 Local week-numbering yearYo令牌日期format 结果parse 结果yo1987-02-111987-ми1987-01-01T00:00:00.000Zyo0005-01-015-ти0005-01-01T00:00:00.000ZYo1987-02-111987-ми1986-12-29T00:00:00.000ZYo0005-01-014-ти0003-12-29T00:00:00.000Z可见年份也带序数词后缀且本地周编号年Yo受weekStartsOn/firstWeekContainsDate影响解析结果落到对应 ISO 周年的 12 月 29 日周一。季度formattingQ与 stand-aloneq令牌日期format 结果parse 结果Qo2019-01-011-ви2019-01-01T00:00:00.000ZQo2019-04-012-ри2019-04-01T00:00:00.000ZQQQ2019-01-011-ви кв.2019-01-01T00:00:00.000ZQQQ2019-04-012-ри кв.2019-04-01T00:00:00.000ZQQQQ2019-01-011-ви квартал2019-01-01T00:00:00.000ZQQQQ2019-04-012-ри квартал2019-04-01T00:00:00.000ZQQQQQ2019-01-0112019-01-01T00:00:00.000ZQQQQQ2019-04-0122019-04-01T00:00:00.000Zqo/qqq/qqqqstand-alone 季度输出与Qo/QQQ/QQQQ完全一致1-ви、1-ви кв.、1-ви квартал等parse同样可还原。对应词表见 localize/index.ts。月份formattingM与 stand-aloneL序数月份Mo / Lo12 个月全部带序数后缀日期Mo / Lo 结果01-111-ви02-112-ри03-113-ти04-104-ти05-105-ти06-106-ти07-107-ми08-108-ми09-109-ти10-1010-ти11-1011-ти12-1012-ти缩写月份MMM / LLL月份结果parse1 月јан2019-01-01T00:00:00.000Z2 月фев2019-02-01T00:00:00.000Z3 月мар2019-03-01T00:00:00.000Z4 月апр2019-04-01T00:00:00.000Z5 月мај2019-05-01T00:00:00.000Z6 月јун2019-06-01T00:00:00.000Z7 月јул2019-07-01T00:00:00.000Z8 月авг2019-08-01T00:00:00.000Z9 月септInvalid Date10 月окт2019-10-01T00:00:00.000Z11 月ноем2019-11-01T00:00:00.000Z12 月дек2019-12-01T00:00:00.000Z全称月份MMMM / LLLLјануари、февруари、март、април、мај、јуни、јули、август、септември、октомври、ноември、декември全部可被 parse 还原。窄格式MMMMM / LLLLL输出与全称相同马其顿语未单独定义窄格式回退到全称parse 均可还原。注意快照中 9 月缩写септ的 parse 结果为Invalid Dateformat 输出的是септ而 match/index.ts 的缩写匹配模式是/^(јан|фев|мар|апр|мај|јун|јул|авг|сеп|окт|ноем|дек)/iсеп而非септ两者不一致导致文本无法被完整消费回填。这是快照作为“行为基线”直接暴露出的边界情况。周与日wo、Io、do、Do令牌日期format 结果parse 结果wo2019-01-011-ви2018-12-31T00:00:00.000Zwo2019-12-0148-ми2019-11-25T00:00:00.000ZIo2019-01-011-ви2018-12-31T00:00:00.000ZIo2019-12-0148-ми2019-11-25T00:00:00.000Zdo2019-02-011-ви2019-02-01T00:00:00.000Zdo2019-02-1111-ти2019-02-11T00:00:00.000Zdo2019-02-2828-ми2019-02-28T00:00:00.000Zdo MMMM2019-02-011-ви февруари2019-02-01T00:00:00.000Zdo MMMM2019-02-1111-ти февруари2019-02-11T00:00:00.000Zdo MMMM2019-02-2828-ми февруари2019-02-28T00:00:00.000ZDo2019-02-1142-ри2019-02-11T00:00:00.000ZDo2019-12-31365-ти2019-12-31T00:00:00.000Z本地周wo与 ISO 周Io在该测试区间结果一致1-ви / 48-ми但注意周序号解析回的是当周的周一如 48-ми → 2019-11-25。星期formattingE、ISOi、locale/c马其顿语一周七天周日开始为недела、понеделник、вторник、среда、четврток、петок、сабота。以 2019-02-11周一与 2019-02-15周五为例令牌周一 format周五 formatparseE / EE / EEEпонпет可还原EEEEпонеделникпеток可还原EEEEEПП可还原窄格式周一/周五同为 ПEEEEEEпопе可还原io1-ви5-ти可还原iii / eee / cccпонпет可还原iiii / eeee / ccccпонеделникпеток可还原iiiii / eeeee / cccccПП可还原iiiiii / eeeeee / ccccccпопе可还原ISO 日io与本地日eo/co的序数结果相同周一为1-ви、周五为5-ти。窄格式EEEEE中周一与周五均输出П因为马其顿语“понеделник周一”和“петок周五”都以 П 开头——这类窄格式歧义在 parse 时由 parseDayPatterns 按顺序取首个匹配项解决。时段AM/PMa、含正午/午夜b、灵活时段B快照显示a/aa/aaa/aaaa/aaaaa、b/bb/bbb/bbbb/bbbbb、B/BB/BBB/BBBB/BBBBB五种宽度输出完全一致时段日期结果aam11:13 / 02:13претпладнеapm14:13 / 19:13попладнеb同上—претпладне / попладнеB 上午11:13наутроB 下午14:13попладнеB 傍晚19:13навечерB 夜间02:13ноќе全部时段类令牌a/b/B 及其各宽度的 parse 结果均为Invalid Date——马其顿语时段的解析模式见 match/index.ts为претпладне / попладне / полноќ / напладне / наутро / навечер / ноќе等完整词而快照输入文本无法被这些模式完整消费。从源码结构看这是 parse 侧对时段文本的覆盖限制format 侧输出不受影响。小时、分钟、秒令牌日期format 结果parse 结果ho[1-12]11:1311-ти11:00:00ho23:1311-ти23:00:00Ho[0-23]11:1311-ти11:00:00Ho23:1323-ти23:00:00Ko[0-11]11:1311-ти11:00:00Ko23:1311-ти23:00:00ko[1-24]11:1311-ти11:00:00ko23:1323-ти23:00:00mo12:011-ви12:01:00mo12:5555-ти12:55:00so12:13:011-ви12:13:01so12:13:5555-ти12:13:55长格式P/p 系列本地化日期、时间与组合日期P 系列以 1987-01-11 等为代表parse均可还原除带 9 月缩写者外令牌示例结果P11/01/1987dd/MM/yyyyPP11 јан 1987dd MMM yyyy9 月为11 септ 1987parse 为 Invalid DatePPP11 јануари 1987dd MMMM yyyyPPPPнедела, 11 јануари 1987EEEE, dd MMMM yyyy含星期全称时间p 系列令牌示例结果parsep12:13H:mm可还原pp12:13:14HH:mm:ss可还原ppp12:13:14 GMT0HH:mm:ss zErroredpppp12:13:14 GMT00:00HH:mm:ss zzzzErrored日期 时间组合令牌示例结果parsePp11/01/1987 12:13可还原PPpp11 јан 1987 12:13:14可还原9 月为 Invalid DatePPPppp11 јануари 1987 12:13:14 GMT0ErroredPPPPppppнедела, 11 јануари 1987 12:13:14 GMT00:00Errored这些模板定义在 formatLong/index.tsshort: dd/MM/yyyy、medium: dd MMM yyyy、long: dd MMMM yyyy、full: EEEE, dd MMMM yyyy时间侧为H:mm、HH:mm:ss、HH:mm:ss z、HH:mm:ss zzzz。快照中ppp/pppp等带时区令牌的 parse 结果为Errored而非 Invalid Date说明带GMT0/GMT00:00时区后缀的文本无法被 mk 的匹配表完整解析属于快照如实记录的解析边界。马其顿语序数词规则源码级快照中大量-ви / -ри / -ми / -ти后缀来自 localize/index.ts 的ordinalNumber实现const rem100 number % 100; if (rem100 20 || rem100 10) { switch (rem100 % 10) { case 1: return number -ви; // 1, 21, 31… case 2: return number -ри; // 2, 22, 32… case 7: case 8: return number -ми; // 7, 8, 27, 28… } } return number -ти; // 其余默认规则可归纳为个位为 1 → -ви个位为 2 → -ри个位为 7 或 8 → -ми其余含 10–20 整段→ -ти。这解释了快照中1-ви、2-ри、7-ми、8-ми、11-ти、42-ри、365-ти的分布。解析侧由 match/index.ts 的/^(\d)(-?[врмт][и])?/i模式匹配任意序数后缀parse提取纯数字。formatDistance马其顿语距离表达快照以2000-01-01 00:00为基准“now”列出过去与未来两个方向的距离表达。核心输出如下完整数据见 snapshot.md目标日期结果includeSeconds: trueaddSuffix: true未来2006-01-01околу 6 години同左за околу 6 години2001-06-01повеќе од 1 година同左за повеќе од 1 година2001-02-01околу 1 година同左за околу 1 година2000-06-015 месеци同左за 5 месеци2000-03-012 месеци同左за 2 месеци2000-01-1514 дена同左за 14 дена2000-01-021 ден同左за 1 ден2000-01-01 06:00околу 6 часа同左за околу 6 часа2000-01-01 00:45околу 1 час同左за околу 1 час2000-01-01 00:3030 минути同左за 30 минути2000-01-01 00:011 минута同左за 1 минута2000-01-01 00:00:25помалку од минутаполовина минутаза помалку од минута2000-01-01 00:00:15помалку од минутапомалку од 20 секундиза помалку од минута2000-01-01 00:00:05помалку од минутапомалку од 10 секундиза помалку од минута2000-01-01 00:00:00помалку од минутапомалку од 5 секундипред помалку од минута过去方向1999-12-31 及更早对应输出为пред …前缀пред 1 минута、пред 15 минути、пред 30 минути、пред 2 дена、пред 2 месеци、пред 7 месеци、пред 1 година、пред 6 години等且includeSeconds的秒级细分同样生效половина минута 半分钟、помалку од 10/20 секунди 不足 10/20 秒。关键实现位于 formatDistance/index.ts词表使用one/other双形模板count 1取one否则将{{count}}替换进other马其顿语无复数三形单数/复数两形即可覆盖当addSuffix: true时comparison 0未来加前缀за否则过去加前缀пред。这与快照中“за未来/ пред过去”的分布完全吻合。另外注意词表中aboutXWeeks的复数形误植为околу {{count}} месеци、aboutXMonths为околу {{count}} недели源码现状从源码结构看属于需要留意的词表细节。formatDistanceStrict精确距离formatDistanceStrict不再使用“околу大约/ повеќе од多于”等约数直接输出精确数字全部支持за/пред后缀与强制单位目标日期结果addSuffix: true强制单位 hour2006-01-016 годиниза 6 години52608 часа2001-06-011 годиназа 1 година12408 часа2000-06-015 месециза 5 месеци3648 часа2000-01-1514 деназа 14 дена336 часа2000-01-021 денза 1 ден24 часа2000-01-01 06:006 часаза 6 часа6 часа2000-01-01 00:4545 минутиза 45 минути1 час2000-01-01 00:1515 минутиза 15 минути0 часа2000-01-01 00:00:2525 секундиза 25 секунди0 часа2000-01-01 00:00:000 секундипред 0 секунди0 часа过去方向输出пред …пред 25 секунди、пред 1 минута、пред 45 минути、пред 1 час、пред 6 часа、пред 17 дена、пред 2 месеци、пред 1 година、пред 5 години等。“强制单位”如unit: hour会把整个差值换算成小时如 2006-01-01 距基准 52608 小时。formatRelative相对时间表达以 2000-01-01 00:00 为基准formatRelative的完整输出目标日期结果2000-01-1010/01/2000超出本周回退 P 格式2000-01-05следната среда вo 0:002000-01-02утре во 0:002000-01-01денес во 0:001999-12-31вчера во 0:001999-12-27овој понеделник вo 0:001999-12-2121/12/1999超出本周回退 P 格式实现位于 formatRelative/index.ts有三个值得注意的语言细节性别一致的名词词尾马其顿语星期名词分“阴性”недела 周日、среда 周三、сабота 周六与“阳性”其余四天模板据此切换——阴性用минатата …/ова …/следната …阳性用минатиот …/овој …/следниот …вo / во 双写法ова … вo 0:00同一周与денес во 0:00今天并存是马其顿语介词的变体写法回退策略lastWeek/nextWeek内部先调用isSameWeekpkgs/core/src/isSameWeek/index.ts判断目标是否仍在同一周若不在则退回“上周/下周”模板超出本周范围如 2000-01-10直接回退Pdd/MM/yyyy。formatDuration时长格式化formatDuration将 Duration 对象格式化为马其顿语覆盖 0/1/2 三档以展示单复数变化Duration结果Duration结果{years:0}0 години{hours:0}0 часа{years:1}1 година{hours:1}1 час{years:2}2 години{hours:2}2 часа{months:0}0 месеци{minutes:0}0 минути{months:1}1 месец{minutes:1}1 минута{months:2}2 месеци{minutes:2}2 минути{weeks:0}0 недели{seconds:0}0 секунди{weeks:1}1 недела{seconds:1}1 секунда{weeks:2}2 недели{seconds:2}2 секунди{days:0}0 дена{days:1}1 ден{days:2}2 дена单复数形态清晰година/години、месец/месеци、недела/недели、ден/дена、час/часа、минута/минути、секунда/секунди全部复用formatDistance词表的单复数两形机制。如何在自己的项目中使用 mk localemk是标准 date-fns locale按 i18n 使用指南 引入即可import { format, formatDistance, formatRelative, parse } from date-fns; import { mk } from date-fns/locale; // 格式化 format(new Date(2019, 0, 11), do MMMM yyyy, { locale: mk }); // 11-ти јануари 2019 format(new Date(1987, 1, 11), PPPP, { locale: mk }); // среда, 11 февруари 1987 // 相对时间 formatRelative(new Date(2000, 0, 2), new Date(2000, 0, 1), { locale: mk }); // утре во 0:00 // 距离 formatDistance(new Date(2000, 5, 1), new Date(2000, 0, 1), { locale: mk }); // 5 месеци使用前请留意快照中记录的三类解析边界9 月缩写септ无法 parse、时段类a/b/B文本 parse 返回 Invalid Date、带时区的ppp/pppp系列 parse 返回 Errored——在设计“先格式化再回填解析”的场景时应避免依赖这些令牌做往返还原。小结mklocale 的本地化行为可完整归纳为“一份快照 五份实现”snapshot.md 记录了全部 format/parse 令牌、距离、相对时间与时长的马其顿语输出localize 定义了序数词与单位词表formatDistance 实现了за/пред前后缀formatLong 提供 P/p 系列模板formatRelative 处理周内/周外与性别词尾match 支撑解析回填。快照与源码互为印证既是一份可直接查阅的语言对照表也是马其顿语支持的行为回归基线。【免费下载链接】date-fns⏳ Modern JavaScript date utility library ⌛️项目地址: https://gitcode.com/gh_mirrors/da/date-fns创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考