如何使用 faker dateTimeBetween 创建假事件?
How to create a fake event with faker dateTimeBetween?
我正在尝试在 Laravel 中创建一个工厂,它将伪造一个在日历上创建的事件。该事件有一个 Start DateTime 和 End DateTime。我希望开始日期是从现在开始的未来某个时间,结束日期时间在开始日期时间的几个小时内。我在开始和结束时一直得到相同的日期时间。
我尝试了从 Google 中找到的几种不同方法,它们都会导致开始和结束日期时间相同。
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,
];
});
我希望开始日期时间介于现在和 1 个月之间,并且,
我希望结束日期时间在开始日期时间和 5 小时后之间。
您的问题实际上很容易识别。您在多个地方使用存储在 $start_date
中的同一个实例,这意味着对该实例的任何更改都将反映在所有地方,因为:
这意味着,如果您创建一个 DateTime
的实例存储在 $start_date
中,然后您调用 $start_date->modify()
将修改该值并将反映在所有包含变量被引用。
因此,您实际上是在传递相同的两个修改后的 $start_date
值来生成 $end_date
值,这就是为什么两个范围边缘的日期相同。
要解决引用问题,您应该 $start_date
的 create a clone 并对其调用 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
.
一起工作
我正在尝试在 Laravel 中创建一个工厂,它将伪造一个在日历上创建的事件。该事件有一个 Start DateTime 和 End DateTime。我希望开始日期是从现在开始的未来某个时间,结束日期时间在开始日期时间的几个小时内。我在开始和结束时一直得到相同的日期时间。
我尝试了从 Google 中找到的几种不同方法,它们都会导致开始和结束日期时间相同。
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,
];
});
我希望开始日期时间介于现在和 1 个月之间,并且, 我希望结束日期时间在开始日期时间和 5 小时后之间。
您的问题实际上很容易识别。您在多个地方使用存储在 $start_date
中的同一个实例,这意味着对该实例的任何更改都将反映在所有地方,因为:
这意味着,如果您创建一个 DateTime
的实例存储在 $start_date
中,然后您调用 $start_date->modify()
将修改该值并将反映在所有包含变量被引用。
因此,您实际上是在传递相同的两个修改后的 $start_date
值来生成 $end_date
值,这就是为什么两个范围边缘的日期相同。
要解决引用问题,您应该 $start_date
的 create a clone 并对其调用 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
.