设置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
相关产品推荐
相关产品推荐

