Laravel碳不考虑时区DST



给定了我的UsersTableSeeder.php类,我使用循环使用假数据播种我的数据库:

$numberOfUsers = 150;
DB::table('users')->delete();
$faker = Faker::create();
for ($i = 1; $i <= $numberOfUsers; $i++) {
    DB::table('users')->insert([
        'id' => $i,
        'firstName' => $faker->firstName,
        'lastName' => $faker->lastName,
        'email' => $faker->email,
        'password' => bcrypt("123"),
        'created_at' => Carbon::now()->addDays((-5 * $i) - 2)->format('Y-m-d H:i:s'),
        'updated_at' => Carbon::now()->addDays(-5 * $i)->format('Y-m-d H:i:s'),
    ]);
}

这里的问题是,当我的日期时间值生成时,它可能会落入DST区域,例如2017-03-12 02:00:00和2017-03-12 02:59:59(确实发生(,这给了我以下错误:

[PDOException]
SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '2016-03-13 02:08:11' for column 'created_at' at row 1

现在,我知道我无法在数据库中放置这样的值,因为我的数据库足够聪明,可以知道该区域及时并不能完全退出。但是,有什么方法可以使碳变得足够聪明以考虑DST?我不想用以下内容手动检查它:

if ($my_date > 2017-03-12 02:00:00 && $my_date < 2017-03-12 02:59:59)

实际上碳可以处理DST区域。

$date = '2017-03-26 02:01:01';
$date = CarbonCarbon::parse($date, 'Europe/Berlin');
dd((string)$date);

导致

// an extra hour was added automatically
"2017-03-26 03:01:01"

每个默认的Laravel在所有日期和日期操作(包括碳(中使用" UTC"。可以在app/config.php

中设置此值

如果您实际上想在数据库中的" UTC"中考虑数据,则可能是这样的方法:

编辑:

// calculate current offset to UTC:
$offset = CarbonCarbon::now('America/Montreal')->offsetHours;
'created_at' => Carbon::now('America/Montreal')->addHours(-4 + $i)->addDays((-1 * $i) - 2)->tz('UTC')->addHours($offset)->format('Y-m-d H:i:s')

您可以用碳生成时间戳并提供时区。尝试:

Carbon::now()->format('c')

相关内容

  • 没有找到相关文章

最新更新