<cfset academic_year = "2012-13">
<cfoutput># academic_year gt "2009-10" #</cfoutput>
输出编号
但如果我将 Academic_year VARIABLE 更改为“2011-12”,则输出为 YES。
ColdFusion 如何强制改变学年?
<cfset academic_year = "2012-13">
<cfoutput># academic_year gt "2009-10" #</cfoutput>
输出编号
但如果我将 Academic_year VARIABLE 更改为“2011-12”,则输出为 YES。
ColdFusion 如何强制改变学年?
只是一个猜测。也许“2011-12”和“2009-10”被视为只有年月的日期,因此 2011 年 12 月大于 2009 年 10 月。“2012-13”没有被视为日期,因为它不是有效的月。
a cfdump
on Academic_year 向您展示了什么?
这可能不是您正在寻找的答案,但我强烈建议,如果您要比较日期,请执行以下两项操作之一:
parseDateTime()
按照 Railo 在其兼容性指南中的建议使用。它会让你免于这样的头痛,让生活更轻松。
您正在比较两个看起来像“yyyy-mm”日期但实际上是“yyyy-yy”字符串的字符串。您想要进行字符串比较而不是日期比较,因此您需要使用显式字符串比较函数而不是让 ColdFusion 推断您的意图。该Compare
功能将为您完成此任务。
<cfset academic_year = "2012-13">
<cfoutput>#Compare(academic_year, "2009-10")#</cfoutput>
如果出于某种原因您仍想使用 GT 语法,您可以使用Val
将您的两年字符串转换为单个年份字符串。
<cfoutput># Val("2012-13") gt Val("2009-10") #</cfoutput>
被视为:
<cfoutput># "2012" gt "2009" #</cfoutput>
请参阅Val 文档以了解其工作原理。
很明显,第二个只是将双方都投射到日期(不正确,但仍然...... CF 像那样“有帮助”),所以答案是“正确的”。
我对为什么您的第一个表达式导致“否”更感兴趣,因为它不能进行日期比较,因为 LHS 不能解释为日期。所以它应该做一个字符串比较,并且“2012-13”大于“2009-10”,所以答案应该是“YES”而不是“NO”。
所以我挖了。检查此代码:
<!--- literal.cfm --->
<cfset var1 = "2012-13">
<cfoutput>#var1 GT "2009-10"#</cfoutput><!--- this outputs: NO --->
<!--- variable.cfm --->
<cfset var1 = "2012-13">
<cfset var2 = "2009-10">
<cfoutput>#var1 GT var2#</cfoutput><!--- this outputs: YES--->
请注意,他们都在比较“2012-13”和“2009-10”。
为什么这样做?因为...如果我正确阅读了反编译的代码... CF 将第一个表达式中的文字“2009-10”视为日期(2009 年 10 月 1 日)...然后看到它需要与字符串(“2012-13”不能转换为日期),并且似乎将日期“2009 年 10 月 1 日”转换回字符串(“40087”...... 1899 年 12 月 31 日和 10 月 1 日之间的天数, 2009)。在进行字符串比较时,“2012-13”是“小于”“40087”。
在literal.cfm 的反编译代码中不存在“2009-10”。唯一的参考是“40087.0D”。所以 CF 看着“2009-10”,尽管它显然是一个字符串(围绕它的引号等),并说“是的,那是一个日期”,即使它被硬编码为一个不能用作日期的表达式. 叹。
所以,无论如何,这就是为什么你看到你所看到的。