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

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

ru
Offline Offline

« : 14-02-2014 09:03 » 

Нужно преобразовать время в 64 бита, сделал так. Как красивее сделать может есть функции библиотечные которые это умеют делать?
Код:
int GetTime() {
time(&rawtime);
counter.timedat = localtime(&rawtime);
        counter.timeint = ((((int64_t)counter.timedat->tm_year<<10)+19000000000000)+((int64_t)counter.timedat->tm_mon<<8)+((int64_t)counter.timedat->tm_mday<<6)+((int64_t)counter.timedat->tm_hour<<4)+((int64_t)counter.timedat->tm_min<<2)+counter.timedat->tm_sec) &0xffffffffffffffff;


return 0;
}
И результат получается 19000000118306 а должно быть 20140214130200
Время нужно в таком формате что бы писать в файл и потом можно было выводить статистику  показаний. Может есть более удобный формат для такой цели?
Базу данных не потянет этот пк.
« Последнее редактирование: 14-02-2014 09:07 от sergeyan » Записан
darkelf
Молодой специалист

no
Offline Offline

« Ответ #1 : 14-02-2014 09:50 » 

tm_sec + (tm_min * 100) + (tm_hour * 10000) + (tm_mday * 1000000) + ((tm_mon + 1) * 100000000) + ((tm_year + 1900) * 10000000000)
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 14-02-2014 10:06 » 

sergeyan, а чем UNIX-время не подходит? Количество секунд эпохи UNIX - вполне себе число. Однозначно восстанавливается в дату и время стандартными же функциями. В стандартной библиотеке новых версий, помнится, были и более современные функции для 64-хбитного значения, и с хранением наносекунд.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Serguntii
Помогающий

ru
Offline Offline

« Ответ #3 : 14-02-2014 15:28 » 

Тоже пойдет. Сейчас еще один момент не знаю как лучше сделать.
Памяти на компе мало а файл постоянно пишется.  Либо сделать круговой буфер в файле, или удалять чего не хотелось. нужно график будет из этих записей строить. Если часть удалить график будет кривой.  Как профи делают?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 14-02-2014 17:14 » 

sergeyan, циркуляцию логов: по достижении определённого размера файл закрывается и открывается новый. Дальше либо по дате, либо по количеству накопленных файлов удаляется самый старый, чтобы совокупный длина истории не превышала лимит по размеру или времени.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Serguntii
Помогающий

ru
Offline Offline

« Ответ #5 : 23-02-2014 21:41 » 

Теперь нужно обратно в строку такого формата  2009/07/12 12:34:56 как проще это можно сделать делить вычитать как-то не красиво получается.
Записан
darkelf
Молодой специалист

no
Offline Offline

« Ответ #6 : 24-02-2014 06:26 » 

посмотрите в сторону strptime(), если таковая функция имеется в системной библиотеке.
Записан
Serguntii
Помогающий

ru
Offline Offline

« Ответ #7 : 24-02-2014 15:38 » 

сделал так может можно более лучше сделать ?
Код:
$temstr = (string) $arctime;
$dattime =  substr($temstr, 0, 4)."/".substr($temstr, 4, 2)."/".substr($temstr, 6, 2)." ".substr($temstr, 8, 2).":".  substr($temstr, 10, 2).":". substr($temstr, 12, 2);
Записан
darkelf
Молодой специалист

no
Offline Offline

« Ответ #8 : 25-02-2014 09:49 » 

сделал так может можно более лучше сделать ?
Код:
$temstr = (string) $arctime;
$dattime =  substr($temstr, 0, 4)."/".substr($temstr, 4, 2)."/".substr($temstr, 6, 2)." ".substr($temstr, 8, 2).":".  substr($temstr, 10, 2).":". substr($temstr, 12, 2);
прошу прощения, невнимательно прочитал задание - необходим strftime()
Записан
Serguntii
Помогающий

ru
Offline Offline

« Ответ #9 : 27-02-2014 21:35 » 

Вопрос по часам нужно устанавливать часики с поправкой на utc как это сделать подскажите ?
Код:
..............
        if(argc > 1)
        {
             struct ts settimestr;
     settimestr.mday = atoi(argv[3]);         /* day of the month */
     settimestr.mon  = atoi(argv[2]);         /* month */ l
     settimestr.year = atoi(argv[1]);         /* year */
     settimestr.hour = atoi(argv[4]);         /* hours */ для москвы +04 не пересчитывать же каждый раз.
     settimestr.min  = atoi(argv[5]);         /* minutes */
     settimestr.sec  = atoi(argv[6]);         /* seconds */                        

             RTC_set(settimestr);
             RTC_init(0);
        }//set time
Записан
Serguntii
Помогающий

ru
Offline Offline

« Ответ #10 : 28-02-2014 12:01 » 

Наверно вас замучил уже. Сори за назойливость, просто хочется доделать а опыта пока мало ).
Наверно нужно как-то из timezone брать поправку. но иногда  и дату придется поправлять.
Например ввожу дату 2014 02 28 2am 00 00 поправка для москвы -4 если вычесть из 2часов ночи 4 часа будет 10pm но нужно будет и дату еще скинуть на один день.
Наверняка есть что то в библиотеках  как править вводимую дату по utc, просто по незнанию ерунду выдумываю.
PS Нужно установить часы  по времени utc но вводить удобнее время местное.
« Последнее редактирование: 28-02-2014 12:12 от sergeyan » Записан
darkelf
Молодой специалист

no
Offline Offline

« Ответ #11 : 28-02-2014 12:17 » new

Наверно нужно как-то из timezone брать поправку. но иногда  и дату придется поправлять.
Например ввожу дату 2014 02 28 2am 00 00 поправка для москвы -4 если вычесть из 2часов ночи 4 часа будет 10pm но нужно будет и дату еще скинуть на один день.
Наверняка есть что то в библиотеках  как править вводимую дату по utc, просто по незнанию ерунду выдумываю.
PS Нужно установить часы  по времени utc но вводить удобнее время местное.
Как вариант - переведите время в секунды, вычтите нужное количество секунд, а затем переведите обратно в struct tm. см mktime()/localtime()/gmtime()
Записан
Serguntii
Помогающий

ru
Offline Offline

« Ответ #12 : 28-02-2014 12:33 » 

Вариант сразу не сообразил спасибки. Какая функция (линукс) возвращает смещение +- часов от utc?
Записан
darkelf
Молодой специалист

no
Offline Offline

« Ответ #13 : 28-02-2014 12:44 » 

можно попробовать следующим образом:
Код: (C)
#include <time.h>
#include <stdio.h>

int main(int argc, char* argv[])
{ time_t t, t1;
  struct tm* tm1;

  time(&t);
 
  tm1 = gmtime(&t);
  t1 = mktime(tm1);

  printf("%d %d %d\n", t, t1, t - t1);

  return 0;
}
при использовании в многопоточных программах, возможно, лучше воспользоваться функциями с суффиксом _r.

Кстати, может Вам это значение и не надо - надо получить время в utc - используйте gmtime(), локальное - localtime().
« Последнее редактирование: 28-02-2014 12:51 от darkelf » Записан
Serguntii
Помогающий

ru
Offline Offline

« Ответ #14 : 28-02-2014 12:56 » 

Все получилось 14400 возвращает.  Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines