2010-04-20 16 views

Respuesta

10

Aunque no es fundamentalmente diferente de la UDF, me gusta this guy's approach. No altamente probados, pero también se podría hacer algo como esto:

Editar Usted no ha mencionado una versión, así que supuse CF8

<cffunction name="relativeDate" returnType="string" access="public" output="false"> 
    <cfargument name="theDate" type="date"> 
    <cfset var x  = "" /> 
    <cfset var diff = "" />  
    <cfset var result = "unknown" />  
    <cfset var dateNow = now() /> 
    <cfset var codes = [ "yyyy", "m", "ww", "d", "h", "n", "s" ] /> 
    <cfset var names = [ "year", "month", "week", "day", "hour", "minute", "second" ] /> 

    <cfif dateCompare(arguments.theDate, now()) gt 0> 
     <!--- replace with other code to handle future dates ....---> 
     <cfthrow message="Future date handling not implemented"> 
    </cfif> 

    <!--- check each date period ...---> 
    <cfloop from="1" to="#arrayLen(codes)#" index="x"> 
     <cfset diff = abs(dateDiff(codes[x], arguments.theDate, dateNow)) /> 
     <!--- this is the greatest date period ---> 
     <cfif diff gt 0 > 
      <cfif diff gt 1> 
       <cfset result = "about "& diff &" "& names[x] &"s ago" /> 
      <cfelseif names[x] eq "hour"> 
       <cfset result = "about an "& names[x] &" ago" /> 
      <cfelse> 
       <cfset result = "about a "& names[x] &" ago" /> 
      </cfif> 

      <cfbreak> 
     </cfif> 
    </cfloop>  

    <cfreturn result /> 
</cffunction> 
+0

¿por qué necesita declarar 'var x'? –

+1

Es una variable de bucle local de función, por lo que también debe tener un alcance var/local. – Leigh

5

Puede probar este UDF de cflib.org: http://cflib.org/udf/ago

+1

no sé qué es un bucle do..while necesario. Podría haberlo devuelto en lugar de romperse. – Henry

+0

no lo he usado, pero es un punto de partida al menos – Antony