![](/img/trans.png)
[英]How can I set Zend DateTime Element to '0000-00-00 00:00:00'?
[英]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.