如何使用faker dateTimeBetween创建虚假事件?

问题描述 投票:1回答:1

我正在尝试在Laravel中创建一个伪造在日历上创建的事件的工厂。该事件具有Start DateTime和End DateTime。我希望开始日期是从现在开始的某个时间,结束日期时间是在开始日期时间的几个小时内。我在开始和结束时都保持相同的dateTime。

我尝试了一些我从谷歌发现的不同方法,它们都导致开始和结束日期时间相同。

use Faker\Generator as Faker;

$factory->define(App\Event::class, function (Faker $faker) {

    $start_date = $faker->dateTimeBetween('+0 days', '+1 month');
    $end_date = $faker->dateTimeBetween($start_date, $start_date->modify('+5 hours'));

    $user = factory(App\User::class)->create();

    return [
        'name' => $faker->sentence,
        'description' => $faker->paragraph,
        'start_date_time' => $start_date,
        'end_date_time' => $end_date,
        'owner_id' => $user->id,
        ];
});

我希望开始DateTime在现在和1个月之间,我希望结束DateTime在开始日期时间和5个小时之间。

php laravel datetime faker
1个回答
0
投票

您的问题实际上很容易识别。您在多个地方使用存储在$start_date中的相同实例,这意味着对该实例的任何更改都将反映在所有地方,因为:

In PHP objects are passed by reference

这意味着如果您创建存储在DateTime中的$start_date实例,然后调用将修改该值的$start_date->modify(),并将反映在引用该变量的所有位置。

所以你基本上传递相同的两个修改的$start_date值来生成$end_date值,这就是为什么你得到两个范围边缘的相同日期。


要解决参考问题,你应该使用你的create a clone$start_date并在其上调用modify以避免修改原始值:

$start_date = $faker->dateTimeBetween('+0 days', '+1 month');
$start_date_clone = clone $start_date;

$end_date = $faker->dateTimeBetween($start_date, $start_date_clone->modify('+5 hours'));

为了缓解参考问题,PHP 5.5引入了DateTimeImmutable,它不对自身应用更改。然而,Faker的dateTimeBetween实现专门检查传递给方法的实例是否是DateTime对象(或者只是简单的日期时间字符串,它可以提供给strtotime()),所以它不适用于DateTimeImmutable

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.