sub rand_date { # Get the options hash my %options = @_; # use the Date::Calc module eval q{ use Date::Calc }; cluck($@) && return if $@; my ( $min_year, $min_month, $min_day, $max_year, $max_month, $max_day ); # Get today's date my ( $year, $month, $day ) = Date::Calc::Today(); if ( $options{'min'} ) { if ( $options{'min'} eq 'now' ) { ( $min_year, $min_month, $min_day ) = ( $year, $month, $day ); } else { ( $min_year, $min_month, $min_day ) = split ( /\-/, $options{'min'} ); } } else { ( $min_year, $min_month, $min_day ) = ( $year, $month, $day ); } if ( $options{'max'} ) { if ( $options{'max'} eq 'now' ) { ( $max_year, $max_month, $max_day ) = ( $year, $month, $day ); } else { ( $max_year, $max_month, $max_day ) = split ( /\-/, $options{'max'} ); } } else { ( $max_year, $max_month, $max_day ) = Date::Calc::Add_Delta_YMD( $min_year, $min_month, $min_day, 1, 0, 0 ); } my $delta_days = Date::Calc::Delta_Days( $min_year, $min_month, $min_day, $max_year, $max_month, $max_day, ); cluck('max date is later than min date') && return if $delta_days < 0; $delta_days = int( rand( $delta_days + 1 ) ); ( $year, $month, $day ) = Date::Calc::Add_Delta_Days( $min_year, $min_month, $min_day, $delta_days ); return sprintf( "%04u-%02u-%02u", $year, $month, $day ); }