DateCompare(date1、date2、“d”)的行为是否与预期的ColdFusion 9不一致?

DateCompare(date1、date2、“d”)的行为是否与预期的ColdFusion 9不一致?,date,coldfusion,coldfusion-9,date-comparison,Date,Coldfusion,Coldfusion 9,Date Comparison,我已经开始在我的一个页面中使用DateCompare()函数。我遇到了一些问题 首先,我在函数中使用的两个日期参数有时可能是空的。我的参数日期1来自于查询,在某些情况下,没有记录。在这种情况下,DateCompare函数抛出错误,因为它只能接受日期值 第二个问题是当我试图检查我的Date1是否大于Date2时,使用“d”表示天数差。我使用了1,它应该表示Date1更大,但当Date1小于或等于Date2时,我的逻辑仍在处理 我想知道这是否是比较ColdFusion中日期的最佳方法,是否有更好的方

我已经开始在我的一个页面中使用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>

是否插入/更新SQL查询

从上面的代码中可以看出,只有当currentBeginDt大于startDt时,我的INSERT/UPDATE才应该执行,但当currentBeginDt为空时也应该执行。如果有人对如何解决这个问题有建议,请让我知道

了解该函数的关键是它被称为DateCompare,而不是StringCompare;-)它用于比较日期对象,而不是字符串或空字符串

是的,CF允许您懒惰并传入日期字符串。但是,CF仍然需要将这些字符串转换为日期对象,然后才能进行比较。因此,这些字符串的解释完全取决于CF。根据输入,它可能会起作用。。或者你可能会得到一些意想不到的/错误的/令人困惑的结果

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

  • 验证输入以确保它实际上是有效日期。如果不是,则中止或应用适当的错误处理
  • 否则,使用或之类的函数将输入字符串转换为日期对象,从CF10开始,这两个函数都支持“format”参数进行解析。对于CF9和更早版本,您将需要自己滚动
  • 确定有有效的日期对象后,将其传递到
  • 当日期1等于或小于日期时,我的逻辑仍在处理

    很可能是因为您使用的是字符串,而CF对这些字符串的解释与您预期的不同。我们需要查看实际值的示例以提供更多细节。

    首先:

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

    …如果date1在date2之后或date1不是日期,则将执行插入/更新查询


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

    虽然理论上很好,但你不应该依赖IsDate。众所周知,它对所谓的“日期”非常“慷慨”,而且在许多情况下都会返回您意想不到的结果。例如,
    IsDate(“1.5”)
    返回true。在将字符串转换为日期时,它还使用类似的规则进行日期比较(美国日期规则)。因此,除了忽略空字符串外,最有可能的结果是相同的。但对于空字符串,它不会返回true,这正是他想要捕捉的。(编辑)修剪和长度检查更适合该用例。除非字符串总是采用CF可以解析的标准US日期格式,否则您仍然需要额外的验证。否则,无法保证DateCompare()会正确转换它们。当从字符串隐式转换为日期时,大多数(如果不是全部的话)标准日期函数。这是他在二读时想要捕捉的,是的,它会处理这种情况,所以我收回了否决票。然而,依靠任意日期字符串的隐式转换仍然是不明智的。如果我从JavaScript中传递日期,它们都是用new Date()创建的,那会怎么样?这在DateCompare中有效吗?或者我仍然必须在ColdFusion中创建日期对象吗?(编辑)源代码并不重要,除非您可以保证输入—这是客户端数据无法做到的。对于未知输入,始终验证。如果输入始终采用特定(美国标准)格式,则不需要日期对象。但是,由于通常情况并非如此,因此最好使用日期对象。这是保证获得预期结果的唯一方法。这两个日期字符串的实际值是多少?我已经用这两个日期值的示例更新了我的问题。(编辑)谢谢,但这些值不会产生您描述的结果:。你确定它们的顺序正确吗?该cfif检查currentBeginDt是否大于startDt。