64-разрядное преобразование метки времени в Unix - PullRequest
10 голосов
/ 27 октября 2011

Существует ли в C ++ реализация 64-битных преобразований меток времени Unix для 32-битных систем? Мне нужно преобразовать struct tm в 64-битное целое и наоборот, включая високосные годы, часовые пояса, UTC. Также он должен быть переносимым, по крайней мере, для GNU / Linux и Windows.

Ответы [ 4 ]

11 голосов
/ 07 ноября 2011

Вам нужно:

typedef long long time64_t; 
time64_t mktime64 (struct tm *t); 
struct tm *localtime64_r (const time64_t *t, struct tm *p);
7 голосов
/ 04 ноября 2011

Функция преобразования struct tm* в time_t равна mktime. Вы можете найти много реализаций этого, например. в Glibc и в libvxc mktime.c file . Вы можете взять код (если он законен для вас, поэтому, пожалуйста, уважайте лицензии) и заменить time_t на 64-разрядное целое число, например int64_t.

Функции, выполняющие другие преобразования из time_t в struct tm*: localtime или gmtime, и вы можете сделать то же самое.

Однако у вас может быть более фундаментальная проблема: ваш 32-битный компьютер, работающий в 2040 году, должен каким-то образом дать вам текущее время (как это делает системный вызов time) в 64-битном варианте time_t, и это намного сложнее (это зависит от ядра и аппаратного обеспечения).

6 голосов
/ 06 ноября 2011

Похоже, вы предполагаете, что time_t является 32-разрядным в 32-разрядных системах, и это может или не может быть правдой.

В Windows, начиная с Visual Studio 2005, размерtime_t является 64-битным, даже когда вы компилируете для 32-битной Windows.

К сожалению, glibc определяет его как long int, что в 32-битных системах является 32-битным целым числом.Это означает, что 32-битная Linux и другие 32-битные платформы, основанные на gcc / glibc (например, Cygwin), не смогут работать с 64-битными метками времени.

Если ваше приложение должно работать на 32-бит glibc, тогда вы должны использовать свои собственные функции преобразования, которые могут быть теми же функциями в библиотеке C, перекомпилированной для использования 64-битных временных меток.

Если вам нужен исходный код с разрешающей лицензией (BSD), вы можете посмотреть на эти функции в minix3. Здесь по местному времени.Источник гиперссылок, поэтому вы можете легко найти остальные.

0 голосов
/ 07 ноября 2011

Да, используйте stuct tm *_localtime64 ( const __time64_t *timer);

Это если ваш поклонник Windows.

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