2017-04-19 141 views
2

鑑於我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) 
+0

您是否試過Carbon :: now('Asia/Tokyo') - > addDays(( - 5 * $ i) - 2) - > format('Ymd H:i:s')'? – linktoahref

+0

爲什麼你需要格式化日期字符串,它應該通過傳遞碳對象來工作,它將被使用的時區就是設置中的那個時區。 – jycr753

回答

0

您可以使用Carbon生成時間戳並提供時區。嘗試只是:

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

好的建議,謝謝。但後來我得到一個錯誤,因爲'2017-04-14T02:36:34 + 00:00'不是我的數據庫預期的格式,而是使用UTC而不是本地時間。 – Antoine

1

事實碳可以處理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') 
+0

如果它處理DST區域,爲什麼它會爲DST區域生成一個未知時間?我是UTC-5(加拿大東部) – Antoine

+1

因爲默認情況下默認值是UTC,而UTC不知道DST。生成的時間在UTC中是完全有效的,但可能是在其他時區無效的時間 –

+0

即使使用您的骯髒解決方法,我也會得到相同的錯誤 – Antoine