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

不输出的ColdFusion胁迫

,但如果我改变academic_year变量设置为“2011-12”的输出是YES。

ColdFusion如何强制变量学年?

+0

您使用的是哪个版本的CF?我在CF9和CF10beta上都试过,两次都评价为“不”。 – Sharondio

+0

应该是泛型比较,但它看起来像评估你的变种。你确定你没有在中设置没有引号的academic_year。 –

回答

1

很明显,第二个只是将两边都投射到日期(不正确,但仍然...... CF是这样的“有用”),所以答案是“正确的”。

我更感兴趣的是为什么你的第一个表达式导致了“NO”,因为它不能进行日期比较,因为LHS不能构造为日期。所以应该做一个字符串比较,并且“2012-13”大于“2009-10”,所以答案应该是“是”而不是“否”。

所以我挖了。查看此代码:

<!--- 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”,尽管显然是一个字符串(引号,等等),并且说“是的,这是一个日期”,尽管它被硬编码为一个表达式,它不能用作日期。叹。

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

+0

其实不,我错了:variable.cfm实际上只是在两个字符串上进行比较。但literal.cfm的解释仍然存在。 –

3

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

academic_year上的cfdump是什么给你看的?

3

这可能不是你要找的答案,但我强烈建议,如果你要比较的是你做的日期一两件事情:

  1. 使用datecompare()功能。
  2. 按照Railo建议的compatibility guide使用parseDateTime()

它可以帮你避免像这样的许多麻烦,让生活更轻松。

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 documentation如何工作的。