5

又拔头发了……

我需要以天为单位计算两个日期之间的差异。我正在这样做:

 <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返回奇怪的值。

4

3 回答 3

7

DateDiff("datepart", date1, date2)接受一个 datepart 和两个 date 对象作为参数。

DateFormat()正如亚当卡梅隆已经说过的那样返回一个字符串而不是日期对象。
ColdFusion 试图通过尝试应用一些已知的日期格式来将“27.07.2012”和“02.10.2012”读取为日期对象。这就是为什么“02.10.2012”被解释为“2012 年 2 月 10 日”。

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

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

于 2012-10-02T14:43:49.473 回答
5

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

您需要了解,仅仅因为“02.10.2012”在您(和我)看来就像一个日期,就计算机而言,它不是一个日期:它是一个字符串。

切勿使用字符串进行日期计算。

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

于 2012-10-02T14:30:51.710 回答
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") )>
于 2012-10-02T14:45:06.140 回答