再次拉出我的头发......
我需要计算两个日期之间的差异。我这样做:
<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.2012
和variables.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
会返回奇怪的值。
答案 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") )>