преобразовать отрицательную метку unixtimestamp в обычное datetime

#mysql #unix-timestamp

#mysql #unix-временная метка

Вопрос:

При использовании Mysql для извлечения данных возникает проблема: отрицательная метка времени не может передать FROM_ UNIXTIME метод, преобразованный в обычную дату:

 FROM_UNIXTIME(-2641363543)

Null
 

Я знаю, что правильная дата, соответствующая этой метке времени: 1886-04-20 00:00:00. Я искал ее, и некоторые люди предположили, что это можно вычислить относительным способом:

 DATE_ADD(FROM_UNIXTIME(0), INTERVAL -2641363543 SECOND)

1886-04-19 23:54:17
 

Но между рассчитанным периодом и правильным значением есть разрыв в несколько минут. Я не знаю, в чем проблема и каким должен быть правильный метод.

Комментарии:

1. -2641363543 — это 1886-04-19 15:54:17 UTC в соответствии с Perl print scalar gmtime(-2641363543) и Ruby Time.at(-2641363543).utc . 1886-04-20 00:00:00 UTC равно -2641334400. Time.gm(1886, 4, 20).to_i

2. Итак, почему они разные?

3. MySQL возвращается в ваш часовой пояс. set time_zone = ' 00:00' для получения согласованных результатов. Как вы вычислили -2641363543 равным 1886-04-20 00:00:00? И в каком часовом поясе ?

4. Одна из возможностей заключается в том, что -2641363543 соответствует астрономической полуночи в каком-то конкретном городе. В 1886 году часовых поясов не было, поэтому некоторые библиотеки времени будут предоставлять местное время, используя смещение, основанное на долготе города.

Ответ №1:

Просто взглянув на это, становится ясно, что -2641363543 — это не полночь. Если вычесть из 1970-01-01 00:00:00 нее, она должна заканчиваться нулем.

Согласно Ruby и Perl, это 1886-04-19 15:54:17 UTC.

 > Time.at(-2641363543).utc 
 => 1886-04-19 15:54:17 UTC
 

Вы хотите -2641334400 .

 > Time.gm(1886, 4, 20).to_i
 => -2641334400
 

И этот метод действительно работает.

 mysql> set time_zone = ' 00:00';
Query OK, 0 rows affected (0.01 sec)

mysql> select FROM_UNIXTIME(0)   INTERVAL -2641334400 SECOND;
 ------------------------------------------------ 
| FROM_UNIXTIME(0)   INTERVAL -2641334400 SECOND |
 ------------------------------------------------ 
| 1886-04-20 00:00:00                            |
 ------------------------------------------------ 
 

Что подводит нас, возможно, к реальной проблеме…

правильная дата, соответствующая этой метке времени: 1886-04-20 00:00:00

Правильно для какого часового пояса?