0
<cfset academic_year = "2012-13">
<cfoutput># academic_year gt "2009-10" #</cfoutput>

输出编号

但如果我将 Academic_year VARIABLE 更改为“2011-12”,则输出为 YES。

ColdFusion 如何强制改变学年?

4

4 回答 4

3

只是一个猜测。也许“2011-12”和“2009-10”被视为只有年月的日期,因此 2011 年 12 月大于 2009 年 10 月。“2012-13”没有被视为日期,因为它不是有效的月。

a cfdumpon Academic_year 向您展示了什么?

于 2012-05-11T18:03:42.403 回答
3

这可能不是您正在寻找的答案,但我强烈建议,如果您要比较日期,请执行以下两项操作之一:

  1. 使用datecompare()函数。
  2. parseDateTime()按照 Railo 在其兼容性指南中的建议使用。

它会让你免于这样的头痛,让生活更轻松。

于 2012-05-11T20:40:35.363 回答
2

您正在比较两个看起来像“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 文档以了解其工作原理。

于 2012-05-12T09:09:32.463 回答
1

很明显,第二个只是将双方都投射到日期(不正确,但仍然...... 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”,尽管它显然是一个字符串(围绕它的引号等),并说“是的,那是一个日期”,即使它被硬编码为一个不能用作日期的表达式. 叹。

所以,无论如何,这就是为什么你看到你所看到的。

于 2012-05-14T15:45:47.307 回答