#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)
и RubyTime.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
Правильно для какого часового пояса?