You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Freemarker中split拆分字符串转列表后迭代失败求助

搞定FreeMarker中split生成的日期字符串无法格式化的问题

嘿,我看你在处理两个日期列表的交集时遇到了类型问题,导致无法正常格式化日期。咱们把问题拆解开,一步步解决:

问题到底出在哪?

你报错的核心原因很明确:split分割出来的每一项都是字符串类型,而?string("MM/dd/yyyy")是FreeMarker专为日期/时间类型提供的格式化方法——字符串根本不认这个方法,所以才会报错说“Expected a method, but this has evaluated to a string”。

另外,从你的代码逻辑看,你可能把「索引值」和「日期对象」搞混了:你用seq_index_of拿到的是list1元素在list2中的索引(是数字),但示例里却用了日期字符串数组,这其实是逻辑上的偏差。咱们先聚焦你的核心需求:找出两个日期列表的共同日期,然后按指定格式输出它们

正确的实现方式

1. 先筛选出两个列表的共同日期(保留日期对象)

别再绕弯子用seq_index_of转字符串了,直接用seq_contains判断元素是否在另一个列表里,这样能直接保留原始的日期对象:

<#-- 前提:list1和list2都是FreeMarker的date对象序列 -->
<#assign commonDates = []>
<#list list1 as dateItem>
  <#if list2?seq_contains(dateItem)>
    <#assign commonDates += [dateItem]>
  </#if>
</#list>

2. 格式化并按要求输出日期

现在commonDates里都是正经的日期对象了,咱们可以直接格式化,同时处理分隔符(前面用分号,最后一个用and):

<#list commonDates as date>
  ${date?string("MM/dd/yyyy")}
  <#-- 处理分隔逻辑:倒数第二个后面加" ; and ",前面的加" ; ",最后一个不加 -->
  <#if date?has_next>
    <#if date?index == commonDates?size - 2> ; and </#if>
    <#elseif date?index != commonDates?size - 1> ; </#if>
  </#if>
</#list>

嫌上面的分隔逻辑麻烦?可以先把格式化后的字符串存到新序列,再用join简化:

<#assign formattedDates = []>
<#list commonDates as date>
  <#assign formattedDates += [date?string("MM/dd/yyyy")]>
</#list>
<#if formattedDates?size > 0>
  ${formattedDates[0..formattedDates?size-2]?join(" ; ")} <#if formattedDates?size > 1>and ${formattedDates?last}</#if>
</#if>

如果必须处理日期字符串怎么办?

要是你因为某些场景只能拿到日期字符串(比如你示例1里的情况),那得先把字符串转成日期对象,再格式化:

<#assign dateStrArray = "2020-10-02,2021-10-04,2022-10-04,2023-10-04" />
<#assign dateObjArray = []>
<#list dateStrArray?split(",") as dateStr>
  <#-- 按字符串的格式解析成date对象 -->
  <#assign dateObj = dateStr?date("yyyy-MM-dd")>
  <#assign dateObjArray += [dateObj]>
</#list>
<#-- 现在就能正常格式化了 -->
<#list dateObjArray as m>
  ${m?string("MM/dd/yyyy")}<#if m?has_next> ; <#else></#if>
</#list>

最后再总结下要点

  • 能保留原始日期对象就别转字符串,避免类型转换的坑
  • 处理字符串转日期时,一定要用?date("对应格式")明确解析规则
  • 找两个列表的交集,seq_containsseq_index_of更直接好用

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

火山引擎 最新活动