tutorial - dateformat coldfusion
¿Por qué DataDiff de ColdFusion devuelve valores extraños/negativos? (3)
Tirando de mi pelo otra vez ...
Necesito calcular la diferencia entre dos fechas en días. Estoy haciendo esto:
<cfset d = DateDiff("d", Dateformat( active_apps.app_base_coupon_start, "dd.mm.yyyy"), Dateformat( variables.useDate, "dd.mm.yyyy") )>
Con active_apps.app_base_coupon_start
= 27.07.2012
y variables.useDate
= today = 02.10.2012
.
Dejé ambos valores, están bien. Sin embargo, dateDiff
devuelve -168
cuando estaba buscando (4 días en julio, 31 en agosto, 30 en septiembre, 2 en octubre) 67 días.
Pregunta:
¿Puede alguien evitar que pierda mi cabello restante y decirme qué estoy haciendo mal aquí o si hay una manera más fácil de obtener la diferencia en días?
EDITAR:
Ok, también funciona así:
<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>
pero aún me gustaría saber por qué dateDiff
devuelve valores extraños.
Estás usando un formato de fecha ambiguo. Cambie el formato de fecha a formato de fecha internacional ( ISO 8601 ) siempre que haga cálculos de fecha y las cosas serán un poco más predecibles. Tenga en cuenta que CF no es compatible con todas las variantes del formato ISO, pero en su mayor parte solo necesita yyyy-mm-dd
que es compatible.
<cfset d = DateDiff("d", Dateformat( active_apps.app_base_coupon_start, "yyyy-mm-dd"), Dateformat( variables.useDate, "yyyy-mm-dd") )>
Lo primero es lo primero, dateAdd()
toma DATES como argumentos, no dateFormat()
-ed cadenas. dateFormat()
es para salida, no para cálculos.
Debes entender que solo porque "02.10.2012" parece una fecha para ti (y para mí), no es una fecha en lo que respecta a la computadora: es una cadena.
Nunca use cadenas para los cálculos de fecha.
En su caso, CF está tratando valientemente de resolver lo que "02.10.2012" podría significar como una fecha y decidir su formato "mm.dd.aaaa", que es el 10 de febrero, mientras que usted se refiere al 2 de octubre.
DateDiff("datepart", date1, date2)
toma una fecha y dos objetos de fecha como argumentos.
DateFormat()
como Adam Cameron ya dijo devuelve una cadena y no un objeto de fecha.
ColdFusion intenta leer "27.07.2012" y "02.10.2012" como objetos de fecha al intentar aplicar algunos formatos de fecha conocidos. Es por eso que "02.10.2012" se interpreta como "10 de febrero de 2012".
No dejaría que ColdFusion adivine el formato de fecha de su cadena. En su lugar, debe crear objetos de fecha mediante CreateDate(year, month, day)
.
now()
también es un objeto de fecha ColdFusion.