Serguntii
Помогающий
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
Молодой специалист
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
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #2 : 14-02-2014 10:06 » |
|
sergeyan, а чем UNIX-время не подходит? Количество секунд эпохи UNIX - вполне себе число. Однозначно восстанавливается в дату и время стандартными же функциями. В стандартной библиотеке новых версий, помнится, были и более современные функции для 64-хбитного значения, и с хранением наносекунд.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Serguntii
Помогающий
Offline
|
|
« Ответ #3 : 14-02-2014 15:28 » |
|
Тоже пойдет. Сейчас еще один момент не знаю как лучше сделать. Памяти на компе мало а файл постоянно пишется. Либо сделать круговой буфер в файле, или удалять чего не хотелось. нужно график будет из этих записей строить. Если часть удалить график будет кривой. Как профи делают?
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #4 : 14-02-2014 17:14 » |
|
sergeyan, циркуляцию логов: по достижении определённого размера файл закрывается и открывается новый. Дальше либо по дате, либо по количеству накопленных файлов удаляется самый старый, чтобы совокупный длина истории не превышала лимит по размеру или времени.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Serguntii
Помогающий
Offline
|
|
« Ответ #5 : 23-02-2014 21:41 » |
|
Теперь нужно обратно в строку такого формата 2009/07/12 12:34:56 как проще это можно сделать делить вычитать как-то не красиво получается.
|
|
|
Записан
|
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #6 : 24-02-2014 06:26 » |
|
посмотрите в сторону strptime(), если таковая функция имеется в системной библиотеке.
|
|
|
Записан
|
|
|
|
Serguntii
Помогающий
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
Молодой специалист
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
Помогающий
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
Помогающий
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
Молодой специалист
Offline
|
|
« Ответ #11 : 28-02-2014 12:17 » |
|
Наверно нужно как-то из timezone брать поправку. но иногда и дату придется поправлять. Например ввожу дату 2014 02 28 2am 00 00 поправка для москвы -4 если вычесть из 2часов ночи 4 часа будет 10pm но нужно будет и дату еще скинуть на один день. Наверняка есть что то в библиотеках как править вводимую дату по utc, просто по незнанию ерунду выдумываю. PS Нужно установить часы по времени utc но вводить удобнее время местное.
Как вариант - переведите время в секунды, вычтите нужное количество секунд, а затем переведите обратно в struct tm. см mktime()/localtime()/gmtime()
|
|
|
Записан
|
|
|
|
Serguntii
Помогающий
Offline
|
|
« Ответ #12 : 28-02-2014 12:33 » |
|
Вариант сразу не сообразил спасибки. Какая функция (линукс) возвращает смещение +- часов от utc?
|
|
|
Записан
|
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #13 : 28-02-2014 12:44 » |
|
можно попробовать следующим образом: #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
Помогающий
Offline
|
|
« Ответ #14 : 28-02-2014 12:56 » |
|
Все получилось 14400 возвращает.
|
|
|
Записан
|
|
|
|
|