You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

设置de/pl等本地化时Jiffy解析日期字符串异常

问题原因及解决办法

核心原因

你遇到的问题是Jiffy在特定本地化(de/pl/ar/fa)下,会使用对应locale的默认日期格式规则覆盖你指定的解析模式,导致无法匹配输入的日期分隔符或格式顺序:

  • 对于德语(de)和波兰语(pl):它们的默认日期分隔符是.而非-,设置这些locale后,Jiffy会自动将你指定的dd-MM-yyyy模式中的-替换为.,但你的输入用的是-,解析器找不到预期的.就会跳过第一个分隔符,把03-02当成连续字符,后续找不到-就报错。
  • 对于阿拉伯语(ar)和波斯语(fa):这类RTL语言的默认日期格式顺序(比如年-月-日)和你指定的dd-MM-yyyy完全不符,即使换空格分隔,解析器还是会按locale默认的顺序匹配,自然找不到对应的格式标记,报错Trying to read dd from。

而en/es/fr等locale的默认日期分隔符支持-,且格式顺序和dd-MM-yyyy兼容,所以解析正常。

解决办法

解析日期时强制使用固定locale(比如en)严格按你指定的模式解析,之后再切换回当前locale生成fromNow()的本地化结果:

// 步骤1:用en locale解析日期,避免当前locale干扰解析规则
var parsedDate = Jiffy.parse(
  "03-02-2024 18:03:47",
  pattern: "dd-MM-yyyy HH:mm:ss",
  locale: "en",
);

// 步骤2:设置回当前需要的locale,确保fromNow()输出对应语言
await Jiffy.setLocale(myLocale.languageCode);

// 步骤3:生成本地化的相对时间文本
var result = parsedDate.fromNow();

另外,不要在build方法中频繁调用异步的setLocale,建议在页面初始化时设置一次,避免build重绘时重复触发异步操作导致状态混乱:

@override
void initState() {
  super.initState();
  WidgetsBinding.instance.addPostFrameCallback((_) async {
    myLocale = Localizations.localeOf(context);
    await Jiffy.setLocale(myLocale.languageCode);
    setState(() {}); // 更新UI
  });
}

内容的提问来源于stack exchange,提问作者BradG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 13:39:53