打印日期不正确

时间:2014-01-13 05:34:46

标签: mysql date symfony doctrine twig

我尝试打印我的应用程序的用户生日,数据库中允许的日期。 在DB中,用户#37的生日时间为'1900-01-01'。

用户模型定义,生日,访问者和属性如下:

/**
 * @ORM\Column(type="date")
 */
 protected $fechaDeNacimiento;

/**
 * @param \DateTime $fechaDeNacimiento
 * @return User
 */
 public function setFechaDeNacimiento($fechaDeNacimiento)
 {
   $this->fechaDeNacimiento = $fechaDeNacimiento;

   return $this;
 }

 /**
  * @return \DateTime 
  */
  public function getFechaDeNacimiento()
  {
    return $this->fechaDeNacimiento;
  }

用Twig写道:

{{ user.fechaDeNacimiento | date("m-d-Y")}}

但结果不是'01 -01-1900',是'12 -31-1899'。格式正确,但日期不正确。

任何想法?。

1 个答案:

答案 0 :(得分:1)

闰秒

这是由于leap second

  

闰秒是偶尔应用的一秒调整   协调世界时(UTC)以保持其时间   接近平均太阳时。

     

具体地说,在第二个之间插入正闰秒   所选UTC日历日期的23:59:59(一个月的最后一天,   通常在6月30日或12月31日)和第二个00:00:00以下   日期。

事实上,12-31-1899中引用了here的闰秒。


修改

大多数数据库支持时区闰秒,例如MySQL

为了给您一个想法,以下是2008-12-31

中定义的闰秒会发生的情况

That's a perfect example in 2008

mysql> CREATE TABLE t1 (
    ->   a INT,
    ->   ts TIMESTAMP DEFAULT NOW(),
    ->   PRIMARY KEY (ts)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> -- change to UTC
mysql> SET time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)

mysql> -- Simulate NOW() = '2008-12-31 23:59:59'
mysql> SET timestamp = 1230767999;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO t1 (a) VALUES (1);
Query OK, 1 row affected (0.00 sec)

mysql> -- Simulate NOW() = '2008-12-31 23:59:60'
mysql> SET timestamp = 1230768000;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO t1 (a) VALUES (2);
Query OK, 1 row affected (0.00 sec)

mysql> -- values differ internally but display the same
mysql> SELECT a, ts, UNIX_TIMESTAMP(ts) FROM t1;
+------+---------------------+--------------------+
| a    | ts                  | UNIX_TIMESTAMP(ts) |
+------+---------------------+--------------------+
|    1 | 2008-12-31 23:59:59 |         1230767999 |
|    2 | 2008-12-31 23:59:59 |         1230768000 |
+------+---------------------+--------------------+
2 rows in set (0.00 sec)

mysql> -- only the non-leap value matches
mysql> SELECT * FROM t1 WHERE ts = '2008-12-31 23:59:59';
+------+---------------------+
| a    | ts                  |
+------+---------------------+
|    1 | 2008-12-31 23:59:59 |
+------+---------------------+
1 row in set (0.00 sec)