为什么ColdFusion的DateDiff返回奇怪/负值?

时间:2012-10-02 14:14:33

标签: date coldfusion datediff

再次拉出我的头发......

我需要计算两个日期之间的差异。我这样做:

 <cfset d = DateDiff("d", Dateformat( active_apps.app_base_coupon_start, "dd.mm.yyyy"), Dateformat( variables.useDate, "dd.mm.yyyy") )>

active_apps.app_base_coupon_start = 27.07.2012variables.useDate =今天= 02.10.2012

我抛弃了两个值,它们没问题。然而dateDiff在我寻找时(7月4天,8月31日,9月30日,10月2日)67天返回-168

问题:
有人可以阻止我丢失剩余的头发并告诉我这里我做错了什么,或者是否有更简单的方法来解决这些问题?

修改
好吧,它也是这样的:

<cfif DateAdd("d", active_apps.app_grace_time, Dateformat( active_apps.app_base_coupon_start, "dd.mm.yyyy") ) GT now()>
     <cfdump output="e:\s\page\t\dump.txt" label="catch" var="YUP"> 
<cfelse>
    <cfdump output="e:\s\page\t\dump.txt" label="catch" var="NOPE"> 
</cfif>

但我仍然想知道为什么dateDiff会返回奇怪的值。

3 个答案:

答案 0 :(得分:7)

DateDiff("datepart", date1, date2)将一个datepart和两个日期对象作为参数。

DateFormat(),因为Adam Cameron already said返回一个字符串,而不是日期对象 ColdFusion试图通过尝试应用一些已知的日期格式来尝试将“27.07.2012”和“02.10.2012”作为日期对象。这就是为什么“02.10.2012”被解释为“2012年2月10日”。

我不会让ColdFusion猜测你的字符串的日期格式。相反,您应该使用CreateDate(year, month, day)创建日期对象。

now()也是一个ColdFusion日期对象。

答案 1 :(得分:5)

首先,dateAdd()将DATES作为参数,而不是dateFormat() - ed字符串。 dateFormat()用于输出,不用于计算。

你需要明白,因为“02.10.2012”看起来像是对你(和我)的日期,就计算机而言,它不是一个日期:它是一个字符串。

绝不使用字符串进行日期计算。

在你的情况下,CF正勇敢地试图找出“02.10.2012”可能意味着什么作为日期,并决定它是“mm.dd.yyyy”格式,即2月10日,而你的意思是10月2日。 / p>

答案 2 :(得分:1)

您使用的是模糊日期格式。无论何时进行日期计算,都会将DateFormat更改为国际日期格式(ISO 8601),事情会更加可预测。请注意,CF不支持ISO格式的每个变体,但在大多数情况下,您只需要支持yyyy-mm-dd

<cfset d = DateDiff("d", Dateformat( active_apps.app_base_coupon_start, "yyyy-mm-dd"), Dateformat( variables.useDate, "yyyy-mm-dd") )>