CFLib.org – Common Function Library Project

CountDown(dateToApproach [, returnMode])

Last updated October 11, 2002

Version: 1 | Requires: ColdFusion 5 | Library: UtilityLib

 
Rated 3 time(s). Average Rating: 3.7

Description:
Feed countdown() a date or dateTime and it will tell you how long until then (or how long ago it was). By default it will return a string describing how long the countdown is, but if you pass a second argument with the value "struct" you can get a struct with the keys: years,months,days,hours,minutes,seconds.

Return Values:
Returns a string or structure.

Example:

view plain print about
<cfscript>
    dateToCountdown = dateAdd("yyyy",2,now());
    dateToCountdown = dateAdd("m",5,dateToCountDown);
    dateToCountdown = dateAdd("d",13,dateToCountDown);
    dateToCountdown = dateAdd("h",3,dateToCountDown);
    dateToCountdown = dateAdd("n",12,dateToCountDown);
    dateToCountdown = dateAdd("s",14,dateToCountDown);
</cfscript>
<cfdump var="#countDown(dateToCountDown,"struct")#">
<cfoutput>#countDown(dateToCountDown)#</cfoutput><br />
<cfdump var="#countDown(createDateTime(2000,03,15,14,1,1),"struct")#">
<cfoutput>#countDown(createDateTime(2000,03,15,14,1,1))#</cfoutput><br />
<cfdump var="#countDown(createDateTime(datePart("yyyy",now()),12,25,0,0,0),"struct")#">
<cfoutput>#countDown(createDateTime(datePart("yyyy",now()),12,25,0,0,0))#</cfoutput>

Parameters:

Name Description Required
dateToApproach Date to count down to. Yes
returnMode Either "text" or "struct." If text, returns a string, otherwise returns structure with keys for years, months, days, hours, and minutes. No

Full UDF Source:

view plain print about
<cfscript>
/**
 * Counts down to a date.
 * 
 * @param dateToApproach      Date to count down to. (Required)
 * @param returnMode      Either "text" or "struct." If text, returns a string, otherwise returns structure with keys for years, months, days, hours, and minutes. (Optional)
 * @return Returns a string or structure. 
 * @author Nathan Dintenfass (nathan@changemedia.com) 
 * @version 1, October 11, 2002 
 */

function countdown(dateToApproach){
    //what mode should we return?  by default, return text
    var returnMode = "text";
    //parse the dateToApproach argument
    var dateToUse = parseDateTime(dateToApproach);
    //grab now(), so we don't have to do it over and over
    var rightNow = now();
    //a struct to hold the data for the countdown
    var countdownData = structNew();
    //a string used to return
    var returnString = "";
    //var to hold the sum to determine if it has passed
    var sum = "";
    //a var to tack on the beginning and end of string return
    var prefix = "";
    var suffix = "";
    //if there is a second argument, make that the returnMode
    if(arrayLen(arguments) GT 1)
        returnMode = arguments[2];
    //get the absolute difference in years, months, days, hours, minutes and seconds    
    countdownData.years = dateDiff("yyyy",rightNow,dateToUse);
    countdownData.months = dateDiff("m",rightNow,dateToUse);
    countdownData.days = dateDiff("d",rightNow,dateToUse);        
    countdownData.hours = dateDiff("h",rightNow,dateToUse);
    countdownData.minutes = dateDiff("n",rightNow,dateToUse);
    countdownData.seconds = dateDiff("s",rightNow,dateToUse) - (60*countdownData.minutes);
    //now go back through them in reverse order and delete off the appropriate units
    countdownData.minutes = countdownData.minutes - (60*countdownData.hours);
    countdownData.hours = countdownData.hours - (24*countDownData.days);
    countdownData.days = countdownData.days - dateDiff("d",dateAdd("m",-1*countDownData.months,dateToUse),dateToUse);
    countdownData.months = countdownData.months - (12*countdownData.years);        
    //if we're returning a struct, just do it
    if(returnMode is "struct")
        return countdownData;
    //otherwise, we'll output a string
    //first, gather the sum, to know if it's future or past
    sum = countDownData.years + countdownData.months + countdownData.days + countdownData.hours + countdownData.minutes + countdownData.seconds;
    //if the sum is 0, it's right now!
    if(NOT sum)
        return "Right Now!";
    //if the sum is negative, it's in the past, so multiply -1 for display purposes
    if(sum LT 0){
        countdownData.seconds = countdownData.seconds * -1;
        countdownData.minutes = countdownData.minutes * -1;
        countdownData.hours = countdownData.hours * -1;
        countdownData.days = countdownData.days * -1;
        countdownData.months = countdownData.months * -1;
        countdownData.years = countdownData.years * -1;
        prefix = "passed ";
        suffix = " ago";
    }
    //add the suffix
    returnString = returnString & prefix;        
    //build the return string  -- showing only the units that are non 0
    if(countDownData.years)
        returnString = returnString & countdownData.years & " years ";
    if(countdownData.months)
        returnString = returnString & countdownData.months & " months ";
    if(countdownData.days)
        returnString = returnString & countdownData.days & " days ";
    if(countdownData.hours)
        returnString = returnString & countdownData.hours & " hours ";
    if(countdownData.minutes)
        returnString = returnString & countdownData.minutes & " minutes ";
    if(countdownData.seconds)
        returnString = returnString & countdownData.seconds & " seconds";
    //add the suffix
    returnString = returnString & suffix;
    //return the string
    return returnString;
}
</cfscript>
blog comments powered by Disqus

Search CFLib.org


Latest Additions

Tayo Akinmade Tayo Akinmade added
arrayTrim
10 day(s) ago

Will Belden Will Belden added
longTime
15 day(s) ago

James Sleeman James Sleeman added
quickSort
25 day(s) ago

Ben Forta Ben Forta added
GetHostAddress
28 day(s) ago

Top Rated

Darwan Leonardo Sitepu EksporSQLData
Rated 5.0, 16 time(s)

Darwan Leonardo Sitepu backupDatabase
Rated 5.0, 13 time(s)

Barney Boisvert indentXml
Rated 5.0, 10 time(s)

Kevin Pepperman generateSsccAsn
Rated 5.0, 4 time(s)

Created by Raymond Camden / Design by Justin Johnson