簡體   English   中英

如何在PHP中正確設置“0000-00-00 00:00:00”為DateTime

[英]How to properly set “0000-00-00 00:00:00” as a DateTime in PHP

我有一個已viewedAt的列,它是DATETIME並接受NULL值。 在每個新記錄上設置該列的軟件限制為0000-00-00 00:00:00所以我使用Symfony和Doctrine進行簡單的方式,如下所示:

$entEmail = new Email();
$entEmail->setViewedAt(new \DateTime('0000-00-00 00:00:00'));

但令人驚訝的是PHP將該日期更改為此-0001-11-30 00:00:00並且MySQL服務器中的SQL模式設置為STRICT,因此查詢失敗。 我已閱讀主題的LOF這里這個這個和其他一些,但沒有回答我的疑問都沒有。 我僅使用PHP進行了一些測試,結果幾乎相同:

$date = new DateTime("0000-00-00 00:00:00", new DateTimeZone('America/New_York'));
echo $date->format('Y-m-d h:i:s');

// outputs
// -0001-11-30 12:00:00

即使將MySQL模式設置為STRICT我也測試了以下查詢,它的工作方式如下圖所示:

INSERT INTO emails(`emails_category`, `deliveredAt`, `viewedAt`, `data`, `createdAt`, `updatedAt`, `reps_id`, `targets_id`) VALUES ("sent","2015-10-29 06:08:25","0000-00-00 00:00:00",null,"2015-10-29 06:08:25","2015-10-29 06:08:25","005800000058eYcAAI","0018000001GO8omAAD")

在此輸入圖像描述

所以viewedAt在接受0000-00-00 00:00:00即使是無效的那個值(我認為這是一種空左右)

我怎么解決這個問題? 有什么工作嗎? 在這個軟件要求無法更改的特定情況下,您對我提出了什么建議?

我正在使用Symfony 2.7.6,Doctrine 2.5.2和PHP 5.5.30

你的架構開始是錯誤的。 問題不在於設置日期本身,這顯然是無效的,MySQL和PHP都拒絕它,因為沒有0年和0月沒有0,你看到的輸出只是對一種有效的日期(1年1月1日和1月1日之前的1天)。 但是你也只是錯過了如果你做得對,Doctrine摘錄它的觀點:

$entEmail = new Email();
$entEmail->setViewedAt(null);

Doctrine現在很樂意將NULL放在數據庫列中。

$Date = date('Y-m-d H:i:s');

是不是更容易使用舊的老式方式?

這取決於您的數據庫字段。 在MySQL中, TIMESTAMP字段是1970年后的。如果你希望它可以為空,你應該讓字段允許為null。 即使你使用DATE字段,它應該是1000AD后。

如果您打算使用實時時間戳,可以使用以下內容:

date_default_timezone_set('America/New_York');
$date = date('Y-m-d H:i:s');

$entEmail = new Email();
$entEmail->setViewedAt( $date );

或者(如果你想要它更簡潔)

date_default_timezone_set('America/New_York');

$entEmail = new Email();
$entEmail->setViewedAt( date('Y-m-d H:i:s') );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM