2017-04-19 1 views
2

Aufgrund meiner UsersTableSeeder.php Klasse betrachtet, mit einer Schleife:Laravel Kohlenstoff, ich bin Impfen meine Datenbank mit gefälschten Daten nicht Zeitzone 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'), 
    ]); 
} 

Das Problem hier ist, dass, wenn meine Datetime-Werte erzeugt werden, eine ist Chance, dass es in eine DST-Zone fallen könnte, wie zwischen 2017-03-12 02:00:00 und 2017-03-12 02:59:59 (was passiert) und es gibt mir den folgenden Fehler:

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

Jetzt verstehe ich, dass ich einen solchen Wert nicht in meine Datenbank eingeben kann, weil meine Datenbank intelligent genug ist, das zu wissen Diese Zeitzone verlässt nicht genau. Aber kann ich Carbon intelligent genug machen, um DST in Betracht zu ziehen? Ich will nicht manuell überprüfen, mit so etwas wie:

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

Haben Sie probiert 'Carbon :: jetzt ('Asia/Tokyo') -> addDays ((- 5 * $ i) - 2) -> Format ('Ymd H: i: s')'? – linktoahref

+0

Warum müssen Sie die Datumszeichenkette formatieren, sie sollte nur funktionieren, indem Sie das Kohlenstoffobjekt übergeben, die Zeitzone, in der es verwendet wird, ist diejenige in den Einstellungen. – jycr753

Antwort

0

Sie können Ihre Zeitstempel mit Kohlenstoff erzeugen und die Zeitzone geben. Versuchen Sie einfach:

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

Guter Vorschlag, danke. Aber dann bekomme ich einen Fehler, weil '2017-04-14T02: 36: 34 + 00: 00' nicht das Format ist, das meine Datenbank erwartet, und es ist in UTC anstatt meiner Ortszeit. – Antoine

1

In der Tat Carbon kann DST-Zonen behandeln.

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

Ergebnisse in

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

Per Default Laravel 'UTC' für alle Datum und Datumzeit-Operationen (einschließlich Kohlenstoff) verwendet. Dieser Wert kann in app eingestellt werden/config.php

Wenn Sie tatsächlich Ihre Datetimes in ‚UTC‘ in der Datenbank so ein schmutziges Abhilfe könnte etwas in Betracht gezogen werden wollen sein:

EDIT:

// 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') 
+0

Wenn es DST-Zonen behandelt, warum generiert es eine nicht vorhandene Zeit für eine DST-Zone? Ich bin UTC-5 (Eastern Canada) – Antoine

+1

Da Standard ist der Standard UTC und UTC kennt nicht DST. Die generierte Zeit ist perfekt in UTC, aber könnte eine Zeit sein, die in anderen Zeitzonen nicht gültig ist –

+0

Auch mit Ihrer schmutzigen Workaround, bekomme ich den gleichen Fehler – Antoine

Verwandte Themen