Laravel碳不考虑时区DST
问题描述:
鉴于我UsersTableSeeder.php
类,我无欲无求我用假数据的数据库,使用循环:Laravel碳不考虑时区DST
$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'),
]);
}
这里的问题是,产生我的datetime值时,有它可能会落入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)
答
您可以使用Carbon生成时间戳并提供时区。尝试只是:
Carbon::now()->format('c')
+0
好的建议,谢谢。但后来我得到一个错误,因为'2017-04-14T02:36:34 + 00:00'不是我的数据库预期的格式,而是使用UTC而不是本地时间。 – Antoine
答
事实碳可以处理DST区域。
$date = '2017-03-26 02:01:01';
$date = \Carbon\Carbon::parse($date, 'Europe/Berlin');
dd((string)$date);
结果
// an extra hour was added automatically
"2017-03-26 03:01:01"
每默认Laravel使用 'UTC' 用于所有日期和日期时间操作(包括碳)。这个值可以在应用程序中设置/ config.php文件
如果你真的想你的日期时间在数据库“UTC”被认为是肮脏的解决办法可能是类似的东西:
编辑:
// calculate current offset to UTC:
$offset = \Carbon\Carbon::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('Asia/Tokyo') - > addDays(( - 5 * $ i) - 2) - > format('Ymd H:i:s')'? – linktoahref
为什么你需要格式化日期字符串,它应该通过传递碳对象来工作,它将被使用的时区就是设置中的那个时区。 – jycr753