问题的关键是您的代码期望 12 mod 4 给出 4,而它给出 0。
您提供的代码已格式化,几乎没有任何换行符,这是一种愚蠢的代码编写方式,因为它很难维护(在可读性、修改甚至简单的修订比较方面),尤其是在以后的开发人员必须出现并了解正在发生的事情。
确保你使用换行符——尤其是当这意味着修复其他人编写的代码时。如果空格的输出是一个问题,那么理想的解决方案通常是将逻辑放在一个函数中(并使用output=false
),尽管您也可以使用<cfsilent>..</cfsilent>
块、适当放置的注释<!--- --->
和其他方式。
以下是将代码的相关部分翻译成实际可读的内容:
<cfif "" neq stec_mysql_search_results.next_run>
0
<cfset temp_next_run = stec_mysql_search_results.next_run MOD 4>
<cfswitch expression="#temp_next_run#">
<cfcase value="1">3</cfcase>
<cfcase value="2">6</cfcase>
<cfcase value="3">9</cfcase>
<cfcase value="4">12</cfcase>
</cfswitch>
-
<cfif 4 lt stec_mysql_search_results.next_run>
#year(now())+1#
<cfelse>
#year(now())#
</cfif>
</cfif>
您在结果中看到的0
是 cfif 中的硬编码。
因为开关没有 0 的情况,所以它没有输出任何东西。
要使现有代码正常工作,只需将 cfcase 的 4 更改为 0。
但是,由于这是处理宿舍,我不认为你在计算你的意思。
这是简单地将 cfcase 从 4 更改为 0 会导致...
January = January
February = February
March = March
April = December
May = January
June = February
July = March
August = December
September = January
October = February
November = March
December = December
当你可能想要的是这样的:
January = March
February = March
March = March
April = June
May = June
June = June
July = September
August = September
September = September
October = December
November = December
December = December
这可以很简单地用3*ceiling(next_run/3)
.
如果这个假设是正确的,那么有一个更好的方法来编写你的代码:
<td>#calculateNextRunQuarter(stec_mysql_search_results.next_run)#</td>
<cffunction name="calculateNextRunQuarter()" returntype="String" output=false>
<cfargument name="NextRunMonth" type="Numeric" required />
<cfset var Quarter = 3*ceiling(Arguments.NextRunMonth/3) />
<cfset var TheYear = Year(Now()) />
<cfif Arguments.NextRunMonth GTE 4 >
<cfset TheYear = TheYear + 1 />
</cfif>
<cfreturn Right('0'&Quarter,2) & '-' & TheYear />
</cffunction>
而且因为逻辑都在 output=false 的函数中,所以没有杂散的空格,代码仍然完全可读