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

出力しないのColdFusion強制ではない明確な

が、私はacademic_year変数を変更する場合は、「2011-12」の出力はYESですします。

可変年度を強制的に強制する方法はありますか?

+0

どのバージョンのCFをお使いですか?私はCF9とCF10betaの両方でそれを試し、 "いいえ"と評価しました。 – Sharondio

+0

英数字で比較する必要がありますが、あなたのvarを評価しているようです。 のように引用なしでacademic_yearを設定していないことを確認してください。 –

答えて

1

2番目のものが日付の両脇にキャストしていたことは間違いありません(間違っていますが... CFはそのように "役立つ")ので、答えは「正しい」です。

LHSが日付として解釈できないため、日付比較を行うことができないため、最初の式が「NO」になった理由についてより興味がありました。したがって、文字列の比較を行う必要があります。「2012-13」は「2009-10」よりも大きいです。その答えは「NO」ではなく「YES」にする必要があります。

だから私は掘った。このコードをチェックアウトしてください:

<!--- 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」は日付にキャストできません)、「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

これはおそらく、あなたが探している答えではありませんが、私は強く、あなたが2つのうちのいずれかの日付を比較しようとしている場合ことを示唆している:

  1. datecompare()関数を使用します。
  2. RailoとしてparseDateTime()を使用すると、compatibility guideが示唆されます。

これは、このような頭痛からあなたを保存し、より簡単になります。

2

「yyyy-mm」の日付のように見える2つの文字列の比較を行っていますが、実際には「yyyy-yy」の文字列です。日付比較ではなく文字列比較を行いたいので、ColdFusionで意図を推測させる代わりに、明示的な文字列比較関数を使用する必要があります。 Compare関数がこのタスクを実行します。

<cfset academic_year = "2012-13"> 
<cfoutput>#Compare(academic_year, "2009-10")#</cfoutput> 

まだGT構文を使用したい場合は、Valを使用して、2年間の文字列を1年間の文字列に変換できます。

<cfoutput># Val("2012-13") gt Val("2009-10") #</cfoutput> 

は、次のように扱われます。

<cfoutput># "2012" gt "2009" #</cfoutput> 

それがどのように機能するかについてVal documentationを参照してください。

関連する問題