尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

date-fns 德语(奥地利)de-AT 语言环境完全指南:format/parse 令牌、相对时间与本地化实现解析

date-fns 德语(奥地利)de-AT 语言环境完全指南:format/parse 令牌、相对时间与本地化实现解析 date-fns 德语奥地利de-AT 语言环境完全指南format/parse 令牌、相对时间与本地化实现解析【免费下载链接】date-fns⏳ Modern JavaScript date utility library ⌛️项目地址: https://gitcode.com/gh_mirrors/da/date-fns本文以 date-fns 仓库中pkgs/core/src/locale/de-AT/snapshot.md德语奥地利区语言环境的官方行为快照为核心系统讲解 de-AT 语言环境下format、parse、formatDistance、formatDistanceStrict、formatRelative、formatDuration六大函数的实际输出规则并对照pkgs/core/src/locale/de-AT/与pkgs/core/src/locale/de/下的真实源码说明「Jänner」「vorm. / nachm.」「1. Quartal」等奥地利特有写法背后的实现原理与配置方式。读完本文你将能够准确预测 de-AT 环境下每个令牌的格式化结果理解本地化数据的组织方式并能在自己的项目中正确导入与使用deAT语言环境。一、de-AT 语言环境在 date-fns 中的定位de-AT德语–奥地利是 date-fns 多语言支持体系中的一员。在仓库中该语言环境由 pkgs/core/src/locale/de-AT/index.ts 定义并导出同时通过 pkgs/core/src/locale/index.ts#L22 中的export * from ./de-AT/index.ts被统一汇总到date-fns/locale入口。从源码结构上看de-AT 并不是从零编写的一整套独立实现而是「复用 de 语言环境的通用部分 覆写奥地利特有部分」的组合式实现。这一点在 de-AT/index.ts 中体现得非常明显import { formatDistance } from ../de/_lib/formatDistance/index.ts; import { formatLong } from ../de/_lib/formatLong/index.ts; import { formatRelative } from ../de/_lib/formatRelative/index.ts; import { match } from ../de/_lib/match/index.ts; import type { Locale } from ../types.ts; // difference to de locale import { localize } from ./_lib/localize/index.ts; export const deAT: Locale { code: de-AT, formatDistance: formatDistance, formatLong: formatLong, formatRelative: formatRelative, localize: localize, match: match, options: { weekStartsOn: 1 /* Monday */, firstWeekContainsDate: 4, }, };可以看到de-AT 与 de 的核心差异集中在localize本地化词表上——尤其是 1 月写作Jänner、缩写为Jän.以及上午/下午使用vorm. / nachm.等奥地利用法。距离、长格式、相对时间与匹配解析则直接复用 de 的实现。options中的weekStartsOn: 1周一为一周起点与firstWeekContainsDate: 4一年第一周须包含 1 月 4 日与德国本地历法规则一致与快照中「Local week-numbering year」等计算结果一一对应。二、snapshot.md 是什么语言环境行为的「黄金基准」每个语言环境目录下都有一份snapshot.md如 de-AT/snapshot.md、de/snapshot.md。它由脚本对真实函数执行结果快照生成记录了该语言环境下全部相关函数的预期输出是校对本地化数据、回归测试与文档参考的权威依据。本文后续所有结果均取自该快照可直接当作断言来使用。快照整体结构分为六大部分覆盖六类函数快照章节对应函数关注点formatandparseformat/parse每个令牌的格式化结果与可解析性formatDistanceformatDistance模糊距离、includeSeconds、addSuffixformatDistanceStrictformatDistanceStrict精确距离、强制单位formatRelativeformatRelative相对日期短语formatDurationformatDuration时长对象转文字下文逐一展开。三、format与parsede-AT 令牌行为全景快照第一部分以「令牌字符串 × 输入日期 → format 结果 → parse 结果」的表格形式逐一给出 de-AT 环境下每个令牌的预期输出。parse列为空串时表示该令牌在解析阶段不可用Invalid Date表示无法唯一解析如下文的单字母星期几Errored表示该长格式包含时区文本而无法解析。3.1 年份与季度令牌语义format 示例parse 结果yo日历年份序数1987 →1987.0005 →5.1987-01-01 / 0005-01-01Yo本地周编号年份1987 →1987.0005 →4.1986-12-29 / 0003-12-29Qo季度格式化序数Q1 →1.2019-01-01QQQ季度格式化缩写Q1 →Q12019-01-01QQQQ季度格式化全称Q1 →1. Quartal2019-01-01QQQQQ季度格式化窄式Q1 →12019-01-01qo/qqq/qqqq/qqqqq季度独立式与格式化同形同上注意Yo本地周编号年份与yo日历年份在跨年边界处结果不同快照中 0005-01-01 按Yo输出4.并解析回 0003-12-29这正是firstWeekContainsDate: 4与周一起始共同作用的结果。3.2 月份奥地利写法的核心差异区de-AT 与 de 最大的差异在 1 月令牌含义1 月输出说明Mo月份序数1.所有月份均为「数字 句点」MMM月份缩写格式化Jän.奥地利缩写区别于德国的 Jan.MMMM月份全称格式化Jänner奥地利全称区别于德国的 JanuarMMMMM月份窄式J仅首字母无法唯一解析快照中 3 月的缩写输出为März无句点保留完整词形5 月Mai、6 月Juni、7 月Juli在缩写与全称中同形。这些数据的来源即 de-AT/_lib/localize/index.ts 中的monthValues与formattingMonthValuesconst monthValues { narrow: [J, F, M, A, M, J, J, A, S, O, N, D] as const, abbreviated: [Jän, Feb, Mär, Apr, Mai, Jun, Jul, Aug, Sep, Okt, Nov, Dez] as const, wide: [Jänner, Februar, März, April, Mai, Juni, Juli, August, September, Oktober, November, Dezember] as const, }; // https://st.unicode.org/cldr-apps/v#/de_AT/Gregorian/ const formattingMonthValues { narrow: monthValues.narrow, abbreviated: [Jän., Feb., März, Apr., Mai, Juni, Juli, Aug., Sep., Okt., Nov., Dez.] as const, wide: monthValues.wide, };关键点在于monthValues独立式 standalone缩写不带句点Jän、FebformattingMonthValues格式化 context缩写带句点Jän.、Feb.这正是快照中MMM输出Jän.而LLL输出Jän的原因源码注释表明词表参考自 Unicode CLDR 的de_ATGregorian 数据仓库中保留了https://st.unicode.org/cldr-apps/v#/de_AT/Gregorian/这一数据来源链接代码注释还特别提醒德语中星期与月份需要首字母大写且格式化结果应像处于句子中间那样自然与西班牙语小写约定相反。3.3 星期几令牌语义示例2019-02-11周一parse 结果E/EE/EEE星期缩写Mo.2019-02-11EEEE星期全称Montag2019-02-11EEEEE星期窄式MInvalid Date无法唯一解析EEEEEE星期短式Mo2019-02-11i/iii/iiii/iiiii/iiiiiiISO 星期周一11./Mo./Montag/M/Mo同 E 系列e/eee/...本地星期周一1同上同上c/ccc/...本地星期独立式同上同上快照中值得注意的细节单字母窄式EEEEE/iiiii/eeeee/ccccc在解析时对「M」Montag返回Invalid Date因为单字母无法在多个 M 开头星期Montag、Mittwoch间唯一确定而 2019-02-15 的FFreitag可解析。这是快照对解析歧义性的如实记录提醒开发者窄式令牌更适合格式化而非解析。星期词表同样定义在 de-AT/_lib/localize/index.ts 的dayValues中So./Mo./Di....与Sonntag/Montag/...de-AT 与 de 在此保持一致。3.4 上午/下午与弹性时段de-AT 的 AM/PM 使用奥地利特有的缩写令牌含义上午输出下午输出a/aa/aaaAM/PM缩写vorm.nachm.aaaaAM/PM全称vormittagsnachmittagsaaaaaAM/PM窄式vm.nm.b/bb/bbbAM/PM/正午/午夜缩写vorm.nachm.bbbb同上全称vormittagsnachmittagsbbbbb同上窄式vm.nm.弹性时段令牌B系列按一天中的时间段输出时间B/BB/BBB缩写BBBB全称02:13nachtsnachts11:13morgensmorgens14:13nachmittagsnachmittags19:13abendsabends快照同时记录了 parse 侧的边界行为B缩写系列解析 14:13 时返回Invalid Date而全称BBBB可解析为当天 12:00——说明弹性时段的缩写解析存在歧义建议解析场景使用全称。这些词表定义在 de-AT/_lib/localize/index.ts 的dayPeriodValues与formattingDayPeriodValues中narrow 用vm./nm.缩写用vorm./nachm.wide 用vormittags/nachmittags。3.5 小时、分钟、秒与日期序号令牌语义示例ho小时 [1-12]序数11:13 →11.23:13 →11.Ho小时 [0-23]序数23:13 →23.Ko小时 [0-11]序数23:13 →11.ko小时 [1-24]序数23:13 →23.mo分钟序数12:55 →55.so秒序数12:13:55 →55.do日序数2 月 11 日 →11.do MMMM日 月份全称11. FebruarDo年内第几天2 月 11 日 →42.12 月 31 日 →365.wo/Io本地/ISO 周序号2019-01-01 →1.de-AT 的序数规则非常统一所有序数均为「数字 句点」无性别/格变化这是由 de-AT/_lib/localize/index.ts 中的ordinalNumber实现保证的const ordinalNumber: LocalizeFnnumber (dirtyNumber) { const number Number(dirtyNumber); return number .; };3.6 长本地化日期P/PP/PPP/PPPP长日期令牌由 de/_lib/formatLong/index.ts 定义de-AT 复用格式遵循 DIN 5008 日期规范源码注释引用了该标准const dateFormats { full: EEEE, do MMMM y, // Montag, 7. Januar 2018 long: do MMMM y, // 7. Januar 2018 medium: do MMM y, // 7. Jan. 2018 short: dd.MM.y, // 07.01.2018 };实际输出结合 de-AT 词表令牌输出示例1987-02-11P11.02.1987dd.MM.yPP11. Feb. 1987PPP11. Februar 1987PPPPMittwoch, 11. Februar 1987快照还验证了 1453 年等历史日期29.05.1453、Sonntag, 29. Mai 1453的格式化与解析均正常。3.7 长本地化时间与日期时间组合时间格式定义在同一文件const timeFormats { full: HH:mm:ss zzzz, long: HH:mm:ss z, medium: HH:mm:ss, short: HH:mm, }; const dateTimeFormats { full: {{date}} um {{time}}, long: {{date}} um {{time}}, medium: {{date}} {{time}}, short: {{date}} {{time}}, };令牌输出示例parse 结果p12:1312:13:00pp12:13:1412:13:14ppp12:13:14 GMT0Errored含时区文本无法解析pppp12:13:14 GMT00:00ErroredPp11.02.1987 12:13完整日期时间PPpp11. Feb. 1987 12:13:14完整日期时间PPPppp11. Februar 1987 um 12:13:14 GMT0ErroredPPPPppppMittwoch, 11. Februar 1987 um 12:13:14 GMT00:00Errored快照明确标注任何含GMT时区文本的长时间格式ppp及以上在parse时一律返回Errored——这是快照文档对解析边界条件的如实记录提醒开发者格式化时若需后续解析应避免使用带时区文本的full/long宽度。四、formatDistance模糊距离的奥地利德语表达快照第二节假设「现在是 2000 年 1 月 1 日 00:00」给出formatDistance的预期输出覆盖三种组合默认、includeSeconds: true、addSuffix: true。节选关键行为日期默认结果includeSecondsaddSuffix2006-01-01etwa 6 Jahre同左in etwa 6 Jahren2001-06-01mehr als 1 Jahr同左in mehr als 1 Jahr2000-01-1514 Tage同左in 14 Tagen2000-01-021 Tag同左in 1 Tag2000-01-01T00:45etwa 1 Stunde同左in etwa 1 Stunde2000-01-01T00:00:25weniger als 1 Minuteeine halbe Minutein weniger als 1 Minute2000-01-01T00:00:00weniger als 1 Minuteweniger als 5 Sekundenvor weniger als 1 Minute1999-12-31T23:4515 Minuten同左vor 15 Minuten1998-06-01mehr als 1 Jahr同左vor mehr als 1 Jahr要点未来时间加前缀in过去时间加前缀vorincludeSeconds仅影响不足 1 分钟时的细分输出5/10/20 秒、半分钟单数用1 Jahr、1 Tag、1 Monat复数用Jahre、Tage、Monate。实现位于 de/_lib/formatDistance/index.ts其核心设计是每个距离令牌同时提供standalone独立与withPreposition带介词两套词形xDays: { standalone: { one: 1 Tag, other: {{count}} Tage }, withPreposition: { one: 1 Tag, other: {{count}} Tagen }, },当addSuffix: true时使用withPreposition14 Tagen第三格否则使用standalone14 Tage。最终前缀逻辑if (options?.addSuffix) { if (options.comparison options.comparison 0) { return in result; } else { return vor result; } }comparison由调用方如formatDistanceToNow根据目标日期在过去还是未来传入-1/1从而决定in/vor。五、formatDistanceStrict精确距离与强制单位快照第三节同样以 2000-01-01 00:00 为基准展示formatDistanceStrict的输出重点列包含第三列「强制单位如 hour」日期默认结果addSuffix强制 hour 单位2006-01-016 Jahrein 6 Jahren52608 Stunden2000-01-01T00:4545 Minutenin 45 Minuten1 Stunde2000-01-01T00:1515 Minutenin 15 Minuten0 Stunden1999-12-31T23:3030 Minutenvor 30 Minuten1 Stunde1998-01-012 Jahrevor 2 Jahren17520 Stunden与formatDistance不同formatDistanceStrict不做四舍五入式的模糊化45 分钟就是45 Minuten且可通过unit选项强制以某单位表达45 分钟按小时计为1 Stunde15 分钟按小时计为0 Stunden。addSuffix同样使用withPreposition词形。六、formatRelative相对日期的地道表达快照第四节以「现在是 2000-01-01 00:00」为基准日期结果2000-01-1010.01.20002000-01-05Mittwoch um 00:002000-01-02morgen um 00:002000-01-01heute um 00:001999-12-31gestern um 00:001999-12-27letzten Montag um 00:001999-12-2121.12.1999实现位于 de/_lib/formatRelative/index.tsconst formatRelativeLocale { lastWeek: letzten eeee um p, yesterday: gestern um p, today: heute um p, tomorrow: morgen um p, nextWeek: eeee um p, other: P, };其中other回退为长日期Pdd.MM.y所以超出相对窗口的日期显示为10.01.2000、21.12.1999。七、formatDuration时长对象的本地化快照最后一节给出formatDuration对Duration对象的输出Duration结果{years:1}1 Jahr{years:2}2 Jahre{months:1}1 Monat{months:2}2 Monate{weeks:1}1 Woche{weeks:2}2 Wochen{days:1}1 Tag{days:2}2 Tage{hours:1}1 Stunde{hours:2}2 Stunden{minutes:1}1 Minute{minutes:2}2 Minuten{seconds:1}1 Sekunde{seconds:2}2 Sekunden同时{years:0}等零值输出为0 Jahre、0 Monate、0 Wochen、0 Tage、0 Stunden、0 Minuten、0 Sekunden零值默认不省略。formatDuration的本地化同样依赖formatDistance词表中的xYears/xMonths等令牌因此单复数变化Jahr/Jahre、Monat/Monate、Tag/Tage、Stunde/Stunden与第四、五节完全一致。八、在项目中导入并使用 de-AT 语言环境de-AT 通过 pkgs/core/src/locale/index.ts#L22 的export * from ./de-AT/index.ts暴露为deAT。使用方式与 i18n.md 描述的通用流程一致——显式导入 locale 并作为locale选项传入import { format, formatDistance, parse } from date-fns; import { deAT } from date-fns/locale; // 格式化奥地利德语月份写法 format(new Date(2019, 0, 11), do MMMM y, { locale: deAT }); // 11. Jänner 2019 // 相对时间带 in/vor 前缀 formatDistance(new Date(2000, 5, 1), new Date(2000, 0, 1), { locale: deAT }); // 5 Monate // 解析奥地利缩写可被正确识别match 复用 de 实现兼容 Jän./Jan. 变体 parse(11. Jänner 2019, do MMMM y, new Date(), { locale: deAT });从 de/_lib/match/index.ts 的正则可以看到月份匹配对j[aä]n同时接受 Jän/Jän. 与 Jan/Jan.、mär[z]?März/Mär等做了兼容处理因此解析时奥地利与德国写法均可被识别星期匹配(son?|mon?|die?|mit?|don?|fre?|sam?)\.?同样容忍带/不带句点的形式。九、快照的工程价值如何验证与扩展snapshot.md 在 date-fns 的语言环境开发流程中承担「行为基准」角色回归基准修改localize、match等词表后重跑快照即可比对输出是否发生变化防止破坏既有格式化结果文档参考所有令牌的组合行为含Invalid Date、Errored等边界都以真实运行结果为据无需阅读源码即可确定预期解析能力清单parse列直接展示哪些格式可以双向转换、哪些仅能格式化是选择令牌时的实用指南。对想要在 de-AT 基础上定制例如新建瑞士德语de-CH或其他变体的开发者仓库中的组合式结构提供了清晰的范本复用相邻语言环境的formatDistance/formatLong/formatRelative/match只需按 de-AT/_lib/localize/index.ts 的方式重写localize词表并在 locale 类型定义Locale接口含code、formatDistance、formatRelative、localize、formatLong、match、options的约束下组装导出即可。语言环境选项weekStartsOn、firstWeekContainsDate则决定了星期与周编号类令牌的计算基准与快照中Yo、wo、Io的输出直接相关。十、快速参考de-AT 关键差异速查表维度de德国de-AT奥地利一月全称MMMM/LLLLJanuarJänner一月缩写MMM/LLLJan. / JanJän. / Jän三月缩写MärzMärz同形上午/下午缩写vorm. / nachm.vorm. / nachm.同形序数形式数字 句点数字 句点同形周起始 / 首周规则周一 / 含 1 月 4 日周一 / 含 1 月 4 日综上de-AT/snapshot.md 是一份可运行的「行为契约」它既完整记录了 de-AT 环境下六类日期函数的全部输出规则又与 de-AT/index.ts、de-AT/_lib/localize/index.ts 等源码相互印证。开发者在实现奥地利德语界面时可将其作为格式化与解析的权威参照并据此快速定位「Jänner」「vorm./nachm.」「1. Quartal」等本地化细节的代码出处。【免费下载链接】date-fns⏳ Modern JavaScript date utility library ⌛️项目地址: https://gitcode.com/gh_mirrors/da/date-fns创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表