Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Кросплатформенное сравнение времени (tm или time_t)  (Прочитано 8651 раз)
0 Пользователей и 1 Гость смотрят эту тему.
IgnisFatuus
Постоялец

ru
Offline Offline

« : 29-04-2015 12:29 » 

Есть код на Си, который должен работать под Linux, Windows и в Linux Kernel.
Смысл кода - сравнения двух дат - какая из них больше.

В идеале хотелось бы функцию которая сможет закрыть этот вопрос по всем трем платформам.
В Linux просто - у меня есть 2 структуры tm,

для обеих
Код: (C (Mac))

time_t = mktime(tm)
difftime(time_t , time_t)

и нет проблем.

А вот для ядра Linux такое вроде не прокатит - там нет difftime.
Для винды - вообще понятия не имею что сделать - я под нее ни разу не писал...
Есть идеи? Заранее спасибо.
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #1 : 29-04-2015 12:44 » 

В Windows тоже есть difftime(). В ядре Linux для соблюдения прототипа можно, наверное, написать что-то типа:
Код: (C)
#define difftime(a, b) (double)((int64_t)(a) - (int64_t)(b))
Правда не уверен, что в ядре Linux можно использовать числа с плавающей запятой. Думаю, что можно ограничиться и
Код: (C)
#define difftime(a, b) ((int64_t)(a) - (int64_t)(b))
Записан
IgnisFatuus
Постоялец

ru
Offline Offline

« Ответ #2 : 29-04-2015 13:19 » 

Огромное спасибо!
Записан
IgnisFatuus
Постоялец

ru
Offline Offline

« Ответ #3 : 29-04-2015 16:17 » 

Кстати, может кому-то пригодится - в ядре Linux есть свой mktime(...) -
суть в получении ПРАВИЛЬНОГО кол-ва секунд с начала unix-эры.
:

Код: (C)
#include <linux/types.h>
struct timeval now;
struct tm tm_now_val;
do_gettimeofday(&now);
time_to_tm(now.tv_sec, 0, &tm_now_val);
current_time = mktime(
        tm_now_val.tm_year,
        tm_now_val.tm_mon,
        tm_now_val.tm_mday,
        tm_now_val.tm_hour,
        tm_now_val.tm_min,
        tm_now_val.tm_sec);

Таким же образом парсим второй tm и сравниваем как подсказал darkelf .

В Windows тоже есть difftime(). В ядре Linux для соблюдения прототипа можно, наверное, написать что-то типа:
Код: (C)
#define difftime(a, b) (double)((int64_t)(a) - (int64_t)(b))
Правда не уверен, что в ядре Linux можно использовать числа с плавающей запятой. Думаю, что можно ограничиться и
Код: (C)
#define difftime(a, b) ((int64_t)(a) - (int64_t)(b))

Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #4 : 30-04-2015 05:46 » 

Кстати, может кому-то пригодится - в ядре Linux есть свой mktime(...) -
суть в получении ПРАВИЛЬНОГО кол-ва секунд с начала unix-эры.
:
Код: (C)
#include <linux/types.h>
struct timeval now;
struct tm tm_now_val;
do_gettimeofday(&now);
time_to_tm(now.tv_sec, 0, &tm_now_val);
current_time = mktime(
        tm_now_val.tm_year,
        tm_now_val.tm_mon,
        tm_now_val.tm_mday,
        tm_now_val.tm_hour,
        tm_now_val.tm_min,
        tm_now_val.tm_sec);
Сорри, в контексте ведения времени не имел дела с ядром Linux, но нужно-ли использовать там mktime()? В том смысле, что do_gettimeofday() нам уже даёт время в секундах (в поле tv_sec). Вроде как после этого преобразовывать его в struct tm, что-бы потом опять получить time_t это лишние действия. Или у Вас просто второй (ну или первый) источник времени его отдаёт в виде struct tm?

Если в обоих случая передаётся время в виде time_t (т.е. секунды с 0:0:0 1.1.1970 UTC), то преобразовывать их в stuct tm уже не надо - можно напрямую сравнивать difftime()-ом время в виде time_t.
« Последнее редактирование: 30-04-2015 09:03 от darkelf » Записан
IgnisFatuus
Постоялец

ru
Offline Offline

« Ответ #5 : 30-04-2015 08:10 » new

Ох.. А вот этого не заметил. Спасибо еще раз, поправлю у себя.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines