2010-04-20 10 views

Antwort

10

Obwohl nicht grundlegend anders als die UDF, ich this guy's approach mögen. Nicht hoch getestet, aber man könnte auch so etwas tun:

bearbeiten Sie haben keine Version erwähnen, so nahm ich 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

Warum müssen Sie die 'var x' deklarieren? –

+1

Es handelt sich um eine Funktions-Local-Loop-Variable, daher muss es auch var/local scoped sein. – Leigh

5

Sie können diese UDF aus cflib.org versuchen: http://cflib.org/udf/ago

+1

Ich weiß nicht, warum eine do..while Schleife erforderlich. Er hätte es einfach zurückgeben können, anstatt zu brechen. – Henry

+0

habe es nicht selbst benutzt, aber es ist ein Ausgangspunkt mindestens – Antony