[英]How to compare dates when DST is changing with Laravel / Carbon
[英]Laravel Carbon does not consider timezone 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)
您可以使用Carbon生成时间戳并提供时区。 试试吧:
Carbon::now()->format('c')
事实上,Carbon可以处理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对所有日期和日期时间操作(包括Carbon)使用“UTC”。 该值可以在app / 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')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.