Napotkałem na niepokojące zachowanie MySQLa przy operowaniu datami.

Taki eksperyment:
  1. SELECT
  2. str_to_date('20/04/1978', '%d/%m/%Y'),
  3. unix_timestamp(str_to_date('20/04/1978', '%d/%m/%Y')),
  4. from_unixtime(unix_timestamp(str_to_date('20/04/1978', '%d/%m/%Y')))


W tym przypadku funkcje unix_timestamp() i from_unixtime() są odwracalne. W 2 kolumnie dostaniemy timestamp: 261871200

Jeśli jednak wykonamy taki skrypt:

  1. <?php
  2. echo date('d', 261871200);
  3. ?>


To zamiast oczekiwanego wyniku 20 dostaniemy wynik 19! Bliższe przyjrzenie zdradza, że
  1. <?php
  2. echo date('d-m-Y H:i:s', 261871200); // wyswietli 19-04-1978 23:00:00
  3. ?>


Za pomocą strtotime(), dla daty 20 kwietnia 1978 otrzymamy timestamp 261874800 - godzinę później niż wartość zwrócona przez MySQL.

I teraz pytanie:
- czy to MySQL czy też PHP błędnie wylicza timestamp? Czy też może to zachowanie jest poprawne?
MySQL w wersji 5.0.38, PHP 5.2.1