Есть ли надежный способ конвертировать unzoned datetime в UNIX time_t? - PullRequest
1 голос
/ 01 декабря 2009

Мне нужно преобразовать столбец базы данных в таблице базы данных (MSSQL) в UNIX time_t. Проблема в том, что в этом столбце нет часового пояса, а некоторые даты из GMT (+0000), а некоторые из BST (+0100). Я работаю в Великобритании раз.

Есть ли надежный способ конвертировать unzoned datetime в UNIX time_t? Я сейчас использую

SELECT *,DATEDIFF(second,'1970-01-01',event_time)

Но, похоже, это зависит от текущего часового пояса, который не применим к дате.

Я не против, если я сделаю преобразование в SQL или коде. Я работаю в Perl.

Ответы [ 3 ]

3 голосов
/ 01 декабря 2009

Если вы имеете в виду, что BST летом и GMT зимой, тогда - это часовой пояс, неявный в столбце, и это не "два разных часовых пояса", это один часовой пояс, называемый Europe/London в БД Olson или GMT0BST,M3.5.0/1,M10.5.0/2 в формате POSIX TZ. Вы легко сможете преобразовать это время, используя модуль DateTime или даже умное использование функций POSIX, за исключением неоднозначного часа вокруг осеннего перехода, который не может быть решен, если вы не сохраните указание на действовал или не действовал BST в то время.

Пример использования DateTime:

use DateTime::Format::MSSQL;
# In reality you would get this from the DB.
my $input = "2009-11-30 16:13:18.123";
my $dt = DateTime::Format::MSSQL->parse_datetime($input);
$dt->set_time_zone("Europe/London");
print "Unix time is ", $dt->epoch, "\n";
1 голос
/ 01 декабря 2009

В SQL 2008 появился новый тип даты и времени: datetimeoffset, который действительно сохраняет информацию о часовом поясе и, таким образом, может использоваться для извлечения различий из эпохи Unix. Но это требует обновления до SQL 2008, пересмотра схемы, изменения типа столбца и обратного обновления всех существующих данных для установки правильного часового пояса.

Если вы не можете выполнить обновление до SQL 2008, то я рекомендую всегда сохранять информацию о дате и времени как UDT, что подразумевает ее преобразование в клиенте перед его вставкой в ​​БД. Отображение данных пользователю в назначенное местное время, опять же, должно быть сделано в клиенте.

0 голосов
/ 01 декабря 2009

Отметка времени UNIX указывается в формате UTC без перехода на летнее время. Поэтому, если вы не можете определить, является ли дата GMT или BST, вы не можете преобразовать ее в метку времени UNIX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...