Creating Random Dates in ColdFusion: RandDateRange( dtFrom, dtTo )
Someone was just asking me how to create a random date in ColdFusion. More specifically, how to create a random date between two dates. The solutions for this is quite simple once you understand it. I have created a method named RandDateRange(). This method functions similar to RandRange( intFrom, intTo ) and actually uses that method under the hood. If you abstract generating a random date between two given dates, it comes down to picking a random point in time. We can create this random point by adding a random time span to the "From Date", making sure, of course, that this random time span does not give us a date past the desired "To Date".
The beauty of time spans in ColdFusion is that they can be represented as a single floating point number. This puts us in the perfect position to use RandRange() to create random time spans. To make sure that we do not create too large a timespan, our bottom range parameter will be zero and our top range parameter will be the difference in seconds between the two out lier dates. Therefore, if we get a random second value and add it to the "From Date", we know we can never go past the "To Date."
<cffunction name="RandDateRange" access="public" returntype="date" output="false" hint="This returns a random date between the two given dates (inclusive)."> <!--- Define arguments. ---> <cfargument name="FromDate" type="date" required="true" /> <cfargument name="ToDate" type="date" required="true" /> <cfscript> // Define the local scope. var LOCAL = StructNew(); // Get the difference in seconds between the two dates. LOCAL.TimeDifference = DateDiff( "s", ARGUMENTS.FromDate, ARGUMENTS.ToDate ); // Create a random time increment based on the second difference. // The time span object is a representation of time-length in // terms of a single floating-point number. LOCAL.TimeIncrement = CreateTimeSpan( 0, // Days 0, // Hours 0, // Minutes RandRange( // Seconds // Our smallest possible time increment. 0, // Our largest possible time increment that will not // put us past the ToDate. LOCAL.TimeDifference ) ); // Get a new random date based on the FromDate and the random // time span. LOCAL.RandomDate = (ARGUMENTS.FromDate + LOCAL.TimeIncrement); // This random date now is formatted like a TimeSpan object, // meaning that it is in the form of one floating point number. return( LOCAL.RandomDate ); </cfscript> </cffunction>
Now to test it out. For the from and to dates, let's pick Now and one month from Now.
Now, get a random date between those to:
As you can see above, the random date is in Time Span format (represented as a single floating point number). In order to fix that, all we have to do is run a date format on it. Now, keep in mind that ColdFusion still treats that as a valid date. You only need to change the formatting on it for display. You can add, diff, subtract all you want on the server side and its all good.
Want to use code from this post? Check out the license.
Thanks for this, nice, tightly coded function that worked straight off the page. Integrated into a site in five minutes. You sire, are a champ.