如何在FTL中编写日期格式?多区域过期日期转换需求
基于区域设置的过期日期转换实现方案
需求说明
- 澳大利亚(en_AU)
- 输入日期字符串:
Ends 31 Jul, 2022 23:59:59 AEST. - 预期输出格式:
Ends 31 Jul 2022
- 输入日期字符串:
- 法国(fr_FR)
- 输入日期字符串:
Expire le juil. 31, 2022 - 预期输出格式:
Expire le 31 juil. 2022
- 输入日期字符串:
FreeMarker 实现方案
核心思路是先将输入的文本字符串解析为日期对象,再根据对应区域设置(locale)格式化输出,同时保留前缀文本。直接用分支判断处理不同locale的逻辑即可:
<#-- 模拟输入的过期日期字符串,可替换为实际数据源 --> <#assign expiredOnStr = "Ends 31 Jul, 2022 23:59:59 AEST." /> <#-- 当前使用的区域设置,可从系统或配置中获取 --> <#assign currentLocale = "en_AU" /> <#-- 按区域设置分支处理 --> <#if currentLocale == "en_AU"> <#-- 解析澳式日期字符串为日期对象 --> <#assign expiredDate = expiredOnStr?datetime("Ends dd MMM, yyyy HH:mm:ss zzz.", "en_AU") /> <#-- 按预期格式输出 --> Ends ${expiredDate?string("dd MMM yyyy", "en_AU")} <#elseif currentLocale == "fr_FR"> <#-- 解析法式日期字符串为日期对象 --> <#assign expiredDate = expiredOnStr?datetime("Expire le MMM. dd, yyyy", "fr_FR") /> <#-- 按预期格式输出 --> Expire le ${expiredDate?string("dd MMM.", "fr_FR")} ${expiredDate?string("yyyy", "fr_FR")} <#else> <#-- 默认降级逻辑,直接输出原字符串 --> ${expiredOnStr} </#if>
代码说明
- 字符串转日期:使用
?datetime(格式模板, locale)方法,严格匹配输入字符串的格式和区域,将文本转换为FreeMarker可处理的日期对象。 - 日期格式化输出:通过
?string(格式模板, locale)将日期对象按目标格式输出,澳式直接用dd MMM yyyy,法式拆分拼接以匹配需求中的顺序。 - 分支逻辑:用
<#if>判断当前locale,确保不同区域的输入输出都符合格式要求。
测试验证
- 当
currentLocale = "en_AU"、expiredOnStr = "Ends 31 Jul, 2022 23:59:59 AEST."时,输出:Ends 31 Jul 2022 - 当
currentLocale = "fr_FR"、expiredOnStr = "Expire le juil. 31, 2022"时,输出:Expire le 31 juil. 2022
内容的提问来源于stack exchange,提问作者R34P3R
相关产品推荐
相关产品推荐

