7

这是我的代码:

$curr_year = date('Y');
$dob_year  = rand($curr_year-18,$curr_year-47);
$dob_month = rand(01,12);
$dob_day   = rand(01,30);

echo $dob = $dob_month.'/'.$dob_day.'/'.$dob_year;

我得到的结果是1/2/1988,但我的要求是结果应该是01/02/1988

4

6 回答 6

7

怎么样:

$min = strtotime("47 years ago")
$max = strtotime("18 years ago");

$rand_time = mt_rand($min, $max);

$birth_date = date('%m/%d/%Y', $rand_time);

基本上:生成几个代表您允许的日期范围的 unix 时间戳,然后使用这些时间戳作为随机数生成器的最小/最大范围。您将返回一个恰好可用作 unix 时间戳的 int,然后您可以根据需要将其输入date()and 格式。

这具有额外的好处/副作用,允许您获得随机出生时间,而不仅仅是日期。

于 2013-05-15T15:26:49.183 回答
4

在这种特殊情况下,您可以使用sprintf

echo sprintf("%02s/%02s/%04s",$dob_month,$dob_day,$dob_year);

但是,我建议将日期处理为日期:

$min = strtotime("jan 1st -47 years");
$max = strtotime("dec 31st -18 years");
$time = rand($min,$max);
echo $dob = date("d/M/Y",$time);
于 2013-05-15T15:08:21.170 回答
2

使用str_pad.

echo $dob = str_pad($dob_month, 2, '0', STR_PAD_LEFT) . '/' . str_pad($dob_day, 2, '0', STR_PAD_LEFT) . '/'.$dob_year;
于 2013-05-15T15:06:00.973 回答
1

您可以使用sprintf,str_paddatewithstrtotime来获得您想要的。

另一个需要注意的是在你的代码中你正在做声明

rand(01,12);

并且以 0 开头,它被解释为八进制数。在这种情况下,这不是问题,因为 01 == 1 但如果您试图在最后一个季度获得一个月,则 09 是一个无效的八进制数,php 会将其解释为 0。请参阅http://php 上的警告。 net/manual/en/language.types.integer.php了解详情

于 2013-05-15T15:14:16.647 回答
0

我也有同样的需求,随机约会。所以这是我的解决方案。生成绝对有效的日期。

// Random birthdate between age
function get_random_birthdate_by_age($min_age, $max_age)
{
    $age = rand($min_age, $max_age);
    $birth_year = date("Y") - $age; // Current year - age
    return date("d.m.Y", strtotime("01.01.{$birth_year} +" . rand(0, 365) . " days"));
}

// Random birthdate between age 0 - 110
function get_random_birthdate()
{
    return get_random_birthdate_by_age(0, 110);
}
于 2014-02-21T09:05:33.853 回答
0

使用str_pad-->手动

$dob = str_pad($dob_month, 2, '0', STR_PAD_LEFT).'/'. str_pad($dob_day, 2, '0', STR_PAD_LEFT).'/'.$dob_year;
echo $dob;
于 2013-05-15T15:07:17.820 回答