php - Laravel Carbon 不考虑时区 DST

标签 php laravel timezone

根据我的 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

现在我明白我不能将这样的值放入我的数据库中,因为我的数据库足够聪明,可以及时知道这个区域并没有完全退出。但是有什么办法可以让 Carbon 足够聪明以考虑 DST 吗?我不想用类似的东西手动检查它:

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

最佳答案

事实上 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')

关于php - Laravel Carbon 不考虑时区 DST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43485258/

相关文章:

php - 如何在PHP中通过数组中另一个键的值搜索来获取一个键的所有值?

mysql - Laravel 或Where 给出意想不到的结果

r - 如何禁用 R 警告 : timezone of object (UTC) is different than current timezone ()

ruby-on-rails - 处理 rails + postgres 和时区

php - 何时将花括号包裹在变量周围

php - MySQL 事务是原子的吗?

PHP 和 node.js 共享 session 标识

mysql - 我可以在 laravel 数据库查询中使用 if 条件吗?

laravel - Laravel 中的错误异常

timezone - MinGW MSYS、MSVCRT 和 TZ 环境变量