DateCompare(date1,date2,“d”)表现不如预期的ColdFusion 9?

时间:2017-03-02 17:25:31

标签: date coldfusion coldfusion-9 date-comparison

我已经开始在我的一个页面中使用DateCompare()函数。我遇到了一些问题。

首先,我在函数中使用的两个日期参数有时可能为空。我的参数日期1来自查询,并且在没有记录时存在某种情况。在这种情况下,DateCompare函数抛出一个错误,因为只能接受日期值。

第二个问题是我尝试检查Date1是否大于Date2时,使用“d”表示天差。我使用了1表示Date1更大,但我的逻辑仍然在Date1小于或等于Date2时处理。

我想知道这是否是比较ColdFusion日期的最佳方式,是否有更好的方法来解决这个问题?这是我的例子:

<!--- This arguments user picks on the screen with date picker --->
<!--- Example startDt value passed to server side: 03/23/2017 --->
<cfargument name="startDt" type="string" required="yes">
<!--- This argument is coming from the query and sometimes can be blank --->
<!--- Example curBegDt value passed to server side: 03/30/2017 ---> 
<cfargument name="currentBeginDt" type="string" required="no" default=""> 

<cfif DateCompare(trim(arguments.currentBeginDt),trim(arguments.startDt),"d") EQ 1>
  Do INSERT/UPDATE SQL Query
</cfif>

从上面的代码中可以看出,我的INSERT / UPDATE只有在currentBeginDt大于startDt时才会执行,但在currentBeginDt为空/空的情况下也应该执行。如果有人建议如何解决这个问题,请告诉我。

2 个答案:

答案 0 :(得分:2)

要理解该功能的关键是它被称为日期比较,而不是StringCompare ;-)它旨在比较日期对象,而不是字符串或空字符串。

是的,CF让你懒惰并传递日期字符串。但是,CF仍然需要将这些字符串转换为日期对象才能进行比较。所以你将这些字符串的解释完全留给CF.根据输入,它可能会工作..或者您可能会得到一些意外/错误/混淆的结果。

确保一致结果的最佳方法是:

  1. 验证输入以确保它实际上是有效日期。如果没有,则中止或应用适当的错误处理。
  2. 否则,使用ParseDateTime()LSParseDateTime()等函数将输入字符串转换为日期对象,这两个函数都支持&#34;格式&#34;从CF10开始解析的参数。对于CF9及更早版本,您需要自己动手。
  3. 确定您拥有有效的约会对象后,请将其传递到DateCompare()
  4.   

    当日期1等于或小于日期

    时,我的逻辑仍然存在

    很可能是因为你正在使用字符串,而CF正在以不同于你期望的方式解释这些字符串。我们需要查看实际值的示例以提供更多细节。

答案 1 :(得分:1)

首先:

<cfif NOT isDate(arguments.currentBeginDt) 
   OR DateCompare(trim(arguments.currentBeginDt),trim(arguments.startDt),"d") EQ 1>

...如果date1在date2之后,或者date1不是日期,则会执行插入/更新查询。

如果date1和date2真的相等,那么DateCompare的结果应为0.如果你得到1并认为它错了,那么检查日期,因为它们可能不是你认为他们是什么。