Форум программистов, компьютерный форум CyberForum.ru

Отображение времени в читаемом виде - C++

Восстановить пароль Регистрация
 
chuvak2008f
4 / 4 / 1
Регистрация: 10.01.2012
Сообщений: 43
06.04.2012, 11:38     Отображение времени в читаемом виде #1
Есть такая функция
C++
1
DWORD GetTickCount(void);
Она выводит кол-во мс от начала старта системы, с помощью неё я вывожу время от старта функции в моей проге:
C++
1
int startMyProg = GetTickCount();
и получаю в любой момент время работы:
C++
1
int timeWork = GetTickCount() - startMyProg;
Теперь вопрос, как можно преобразовать это время в удобно перевариваемый вид: 00:24:45
Существуют ли стандартные функции или нужно писать свою?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
06.04.2012, 12:36     Отображение времени в читаемом виде #2
Цитата Сообщение от chuvak2008f Посмотреть сообщение
Существуют ли стандартные функции или нужно писать свою?
А что тут писать? на 24*3600*1000 делишь - дни, остаток на 3600*1000 - часы, остаток на 60*1000 - минуты, остаток на 1000 секунды, остаток мс
-=ЮрА=-
Заблокирован
Автор FAQ
06.04.2012, 14:50     Отображение времени в читаемом виде #3
chuvak2008f, посмотри сюда
Детальная информация о времени работы системы
chuvak2008f
4 / 4 / 1
Регистрация: 10.01.2012
Сообщений: 43
06.04.2012, 16:23  [ТС]     Отображение времени в читаемом виде #4
Цитата Сообщение от Nekto Посмотреть сообщение
А что тут писать? на 24*3600*1000 делишь - дни, остаток на 3600*1000 - часы, остаток на 60*1000 - минуты, остаток на 1000 секунды, остаток мс
Я в общем то искал стандартный метод. А так то своё это не проблема

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Много букаф для такой скромной задачи, потом почитаю

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// *** MEDIUM КОД
 
String toNormalTime(DWORD dMillisec) {
    float dSec = dMillisec / 1000;
 
    int iHour   = int(dSec / 3600),
        iMin    = int(dSec / 60 - iHour * 60),
        iSec    = int(dSec - int(dSec / 60) * 60);
    String  hour    = (iHour<10)? "0"+IntToStr(iHour): IntToStr(iHour),
            min     = (iMin<10)?  "0"+IntToStr(iMin):  IntToStr(iMin),
            sec     = (iSec<10)?  "0"+IntToStr(iSec):  IntToStr(iSec);
 
    return hour+":"+min+":"+sec;
}
 
// *** HARD КОД
 
String toNormalTime(DWORD dMillisec) {
    float dSec = dMillisec / 1000;
    int iHour, iMin, iSec;
    String  hour    = ((iHour   =int(dSec / 3600))<10)?                 "0"+IntToStr(iHour): IntToStr(iHour),
            min     = ((iMin    =int(dSec / 60 - iHour * 60))<10)?      "0"+IntToStr(iMin):  IntToStr(iMin),
            sec     = ((iSec    =int(dSec - int(dSec / 60) * 60))<10)?  "0"+IntToStr(iSec):  IntToStr(iSec);
    return hour+":"+min+":"+sec;
}
Хотя как не странно, первый выполняется на порядок быстрее, чем второй.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
06.04.2012, 16:56     Отображение времени в читаемом виде #5
а так не быстрее?
C++
1
2
3
4
5
6
7
8
9
10
char* toNormalTime(DWORD dMillisec) {
    int iSec = dMillisec/1000;
    int iHour   = iSec/3600;
    iSec%=3600;
    int iMin    = iSec/60;
    iSec %=60;
    char* s=new char[9];
    sprintf(s,"%c%c:%c%c:%c%c",iHour/10+48,iHour%10+48,iMin/10+48,iMin%10+48,iSec/10+48,iSec%10+48);
    return s;
}
Правда, только для часов <100 работать будет по идее
-=ЮрА=-
Заблокирован
Автор FAQ
06.04.2012, 18:57     Отображение времени в читаемом виде #6
Цитата Сообщение от chuvak2008f Посмотреть сообщение
Много букаф для такой скромной задачи, потом почитаю
- ну и зря, по поводу твоего кода - тихий ужас(без обид - констатирую затраты кода положенные на его эффективность)
По поводу второго кода - Nekto, спецификатор формата %c означает что преобразовываться будет к чарам, на кой прибавлять +48 если сразу можно записать
C
1
sprintf(s,"%d%d:%d%d:%d%d",iHour/10,iHour%10,iMin/10,iMin%10,iSec/10,iSec%10);
А вообще парни пишите как вам удобней, я лишь помочь хотел
-=ЮрА=-
Заблокирован
Автор FAQ
06.04.2012, 19:22     Отображение времени в читаемом виде #7
Привожу код который работает с любым числом тиков. В режиме реального времени идёт индикация от чила дней до миллисекунд
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <windows.h>
#include <stdio.h>
 
char * UpdateTime(DWORD dwTime)
{
    char sTime[256] = {0};
    ULONG uDiv = 3600*24*1000;
    UINT uTime = dwTime/uDiv;
    dwTime     = dwTime%uDiv;
    uDiv = uDiv / 24;
    sprintf(sTime,"%02d:",uTime);//Записали число дней
    do
    {
        uTime  = dwTime/uDiv;
        dwTime = dwTime%uDiv;
        sprintf(sTime,"%s%02d:",sTime, uTime);
    }
    while(1000 < dwTime && (uDiv = uDiv/60));
    sprintf(sTime,"%s%03d",sTime, dwTime);//Записали число миллисекунд
    return &sTime[0];
}
 
int main()
{
    DWORD dwTime = 0;
    while(TRUE)
    {
        system("cls");
        dwTime = GetTickCount();
        printf("NT UPTIME DD:HH:MM:SS:MS %s",UpdateTime(dwTime));
        Sleep(100);
    }
    return 0;
}
Миниатюры
Отображение времени в читаемом виде  
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
06.04.2012, 20:17     Отображение времени в читаемом виде #8
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
По поводу второго кода - Nekto, спецификатор формата %c означает что преобразовываться будет к чарам, на кой прибавлять +48 если сразу можно записать
C
1
sprintf(s,"%d%d:%d%d:%d%d",iHour/10,iHour%10,iMin/10,iMin%10,iSec/10,iSec%10);
А вообще парни пишите как вам удобней, я лишь помочь хотел
Для ускорения процесса Разве это не быстрее будет? %d ведь не знает сколько будет символов, а мы знаем, что всего лишь 1.
-=ЮрА=-
Заблокирован
Автор FAQ
06.04.2012, 20:36     Отображение времени в читаемом виде #9
Nekto, есть еще спецификатор длинны при этом для часов и минут и секунд нужно два символа или по твоему система не может работать подряд скажем часов 20.В общем подумай еще раз что ты написал...
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
06.04.2012, 21:05     Отображение времени в читаемом виде #10
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Nekto, есть еще спецификатор длинны при этом для часов и минут и секунд нужно два символа или по твоему система не может работать подряд скажем часов 20.В общем подумай еще раз что ты написал...
Так мой вариант для времени работы <100 часов работает. Или нет? Если предусматривается больше, то да. А так я просто привёл к виду ХХ:ХХ:ХХ (т.е. по 2 символа ЧЧ:ММ:СС).
-=ЮрА=-
Заблокирован
Автор FAQ
06.04.2012, 21:13     Отображение времени в читаемом виде #11
Nekto, твои %с%с (два символа)очень легко заменяются спецификатором длины %2d(тоже будет два символа).
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
07.04.2012, 02:23     Отображение времени в читаемом виде #12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Nekto, твои %с%с (два символа)очень легко заменяются спецификатором длины %2d(тоже будет два символа).
оно 0 не вставит в начале, если у нас число меньше 10 :Р
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
07.04.2012, 04:13     Отображение времени в читаемом виде #13
Цитата Сообщение от Nekto Посмотреть сообщение
оно 0 не вставит в начале, если у нас число меньше 10
C
1
2
int i = 1;
printf("%02d\n", i);
а так?
-=ЮрА=-
Заблокирован
Автор FAQ
07.04.2012, 09:33     Отображение времени в читаемом виде #14
Nekto, если бы раскрыл глаза и посмотрел мой код
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
sprintf(sTime,"%s%02d:",sTime, uTime);
то понял бы что пишешь глупость. Кроме того
Цитата Сообщение от Nekto Посмотреть сообщение
Для ускорения процесса Разве это не быстрее будет
- сомнительно, т.к. в твоём случае будет выполняться на 12 операций больше. Или по твоему дополнительное деление (/ или %), а также прибавление 48 не отнимает процессорного времени?
-=ЮрА=-
Заблокирован
Автор FAQ
07.04.2012, 09:46     Отображение времени в читаемом виде #15
Nekto, вот то о чём говорил
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#include <time.h>
 
int main()
{
    int nHours   = 0;
    int nMinutes = 48;
    int nSeconds = 59;
    long i, N = 100000;
    long dif1, dif2;
    long start,end;
    start = clock();
    for(i = 0; i < N; i++)
        printf
        (
            "Nekto %c%c:%c%c:%c%c\n",
            nHours/10 + 48,nHours%10 + 48,
            nMinutes/10 + 48,nMinutes%10 + 48,
            nSeconds/10 + 48, nSeconds%10 + 48
        );
    
    end   = clock();
    dif1 = end - start;
    
    start   = clock();
    for(i = 0; i < N; i++)
        printf("YurA  %02d:%02d:%02d\n",nHours,nMinutes,nSeconds);
    end     = clock();
    dif2 = end - start;
 
    printf("Time of operations :\n");
    
    printf("Nekto %u\n",dif1);
    printf("YurA  %u\n",dif2);
    getchar();
    return 0;
}
Думаю тут уже нечего говорить
Time of operations :
Nekto 6265
YurA 6156
Т.е. ты даже не ускорил свой код а замедлил
Миниатюры
Отображение времени в читаемом виде  
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
07.04.2012, 11:45     Отображение времени в читаемом виде #16
You win =)

Добавлено через 12 минут
но мой вариант все равно работает быстрее варианта с ифами

Не по теме:

не знал, что можно задавать %02d (о нулях ), не зря на форум захожу, новое узнаю

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2012, 12:48     Отображение времени в читаемом виде
Еще ссылки по теме:

C++ Отображение гирлянды
C++ Преобразовать период времени p, заданный в секундах (p<=86400) в часы, минуты и секунды, результат вывести в виде чч:мм:сс .
C++ Вывести на экран матрицу порядка n (n=1..15) - элементы выводятся не в виде матрицы, а в виде строки

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
07.04.2012, 12:48     Отображение времени в читаемом виде
  #17

Не по теме:

Nekto, главное что ты умеешь извлекать пользу из постов, а знания это сила, так что читай ты стал сильней как програмист(хоть и на чуточку но сильней)
PS:

Цитата Сообщение от Nekto Посмотреть сообщение
You win =)
, это не было моей целью просто %c и +48 резали глаза вот и решил вступить с тобой в дискус

Yandex
Объявления
07.04.2012, 12:48     Отображение времени в читаемом виде
Ответ Создать тему
Опции темы

Текущее время: 11:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru