URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7672
[ Назад ]

Исходное сообщение
"Как получить время заданного форамата (+долисекунды) в С"

Отправлено Serega.M , 28-Окт-08 13:21 
Требуется вывести на экран текущее время в формате Час:Минуты:Секунды:Долисекyнды.
Язык - C/C++
Среда - Linux (Cygwin или OpenSuse).

Помогите плиз. :)


Содержание

Сообщения в этом обсуждении
"Как получить время заданного форамата (+долисекунды) в С"
Отправлено Michelnok , 28-Окт-08 13:26 
>Требуется вывести на экран текущее время в формате Час:Минуты:Секунды:Долисекyнды.

Доли какого размера? Милли? Микро? Нано?


"Как получить время заданного форамата (+долисекунды) в С"
Отправлено Serega.M , 28-Окт-08 13:41 
>>Требуется вывести на экран текущее время в формате Час:Минуты:Секунды:Долисекyнды.
>
>Доли какого размера? Милли? Микро? Нано?

Милли :)))


"Как получить время заданного форамата (+долисекунды) в С"
Отправлено vic , 28-Окт-08 13:46 
>>>Требуется вывести на экран текущее время в формате Час:Минуты:Секунды:Долисекyнды.
>>
>>Доли какого размера? Милли? Микро? Нано?
>
>Милли :)))

man gettimeofday


"Как получить время заданного форамата (+долисекунды) в С"
Отправлено Serega.M , 28-Окт-08 13:54 
>>>>Требуется вывести на экран текущее время в формате Час:Минуты:Секунды:Долисекyнды.
>>>
>>>Доли какого размера? Милли? Микро? Нано?
>>
>>Милли :)))
>
>man gettimeofday

А можно примерчик?


"Как получить время заданного форамата (+долисекунды) в С"
Отправлено Michelnok , 28-Окт-08 13:59 
>>
>>man gettimeofday
>
>А можно примерчик?

Извини. Указание было правильное, и это единственная неочевидная для не-UNIX программиста функция. Как использовать ее и остальные (gmtime/localtime и printf) - выясни сам. Иначе тебе нечего делать в C.


"Как получить время заданного форамата (+долисекунды) в С"
Отправлено Serega.M , 28-Окт-08 14:06 
>>>
>>>man gettimeofday
>>
>>А можно примерчик?
>
>Извини. Указание было правильное, и это единственная неочевидная для не-UNIX программиста функция.
>Как использовать ее и остальные (gmtime/localtime и printf) - выясни сам.
>Иначе тебе нечего делать в C.

Ну, ладно :) Просто синтаксис не очень понятен для меня.


"Как получить время заданного форамата (+долисекунды) в С"
Отправлено Serega.M , 29-Окт-08 12:52 
Я сделал вот так:

#include "windows.h"
#include "stdio.h"

int main()
{
    SYSTEMTIME time;
    GetSystemTime(&time);
    printf ("Hours: %i;\n\rMinuts: %i;\n\rSeconds: %i;\n\rmiliseconds: %i\n\r", time.wHour+2, time.wMinute, time.wSecond, time.wMilliseconds);

}


Работает.. но я как не очень доволен, что часы корректирую... Можно как-нить это исправить???


"Как получить время заданного форамата (+долисекунды) в С"
Отправлено vic , 29-Окт-08 14:00 
>[оверквотинг удален]
>{
> SYSTEMTIME time;
> GetSystemTime(&time);
> printf ("Hours: %i;\n\rMinuts: %i;\n\rSeconds: %i;\n\rmiliseconds: %i\n\r", time.wHour+2, time.wMinute, time.wSecond, time.wMilliseconds);
>
>}
>
>
>Работает.. но я как не очень доволен, что часы корректирую... Можно как-нить
>это исправить???

1. это форум по unix/posix, а не windows(не posix совсем). Для posix-совместимых систем выше уже была указана нужная функция.
2. вышеуказанный код не портабелен и специфичен для windows.
3. банальное: где return или exit() ?
4. часы корректировать подобным образом это не по христиански :)
5. правильно \r\n, а не наоборот.
6. традиционно используется %d, хотя в windows хз
7. и наконец, формат в вашем примере не соответствует формату вывода в первом вашем посте :)


"Как получить время заданного форамата (+долисекунды) в С"
Отправлено Serega.M , 29-Окт-08 19:18 
>1. это форум по unix/posix, а не windows(не posix совсем). Для posix-совместимых
>систем выше уже была указана нужная функция.
>2. вышеуказанный код не портабелен и специфичен для windows.
>3. банальное: где return или exit() ?
>4. часы корректировать подобным образом это не по христиански :)
>5. правильно \r\n, а не наоборот.
>6. традиционно используется %d, хотя в windows хз
>7. и наконец, формат в вашем примере не соответствует формату вывода в
>первом вашем посте :)

Могу сделать вывод - надо идти вам в QA.

1. Смотри ниже.
2. Согласен, но мне полюбе, так как за это мне не платят ;)
3. Добавил.. для меня не критично
4. Вот и я так думаю ;)
5. Ну, эт как посмотреть
6. Эх, традиции...
7. Формат не так уж и тяжело подделать

Сделал вот так для сравнения:
#include <sys/time.h>
#include <stdio.h>
#include <windows.h>

int main(void)
{
  char buffer[30];
  struct timeval tv;

  time_t curtime;

  gettimeofday(&tv, NULL);
  curtime=tv.tv_sec;

  strftime(buffer,30,"%H:%M:%S",localtime(&curtime));
  printf("\nLinux: ");
  printf("%s:%d Seconds???:%d",buffer,tv.tv_usec,tv.tv_sec);

  SYSTEMTIME time;
  GetSystemTime(&time);
  printf("\nWindows: ");
  printf ("%d:%d:%d:%d", time.wHour+2, time.wMinute, time.wSecond, time.wMilliseconds);

  return 0;
}

Получаю в результате:
Linux: 18:13:55:271892 Seconds???:1225296835
Windows: 18:13:55:271

Что по сути правильно, но только вот появились вопросы:
1. Почему секунды не совпадают в tv.tv_sec?
2. Почему не работает форматирование для %2.2d? Это можно исправить?


"Как получить время заданного форамата (+долисекунды) в С"
Отправлено Keeper , 29-Окт-08 19:46 
>2. Почему не работает форматирование для %2.2d? Это можно исправить?

Потому что так неправильно. Либо "%2.2f", либо "%2d".
man printf - format specifiers


"Как получить время заданного форамата (+долисекунды) в С"
Отправлено Serega.M , 30-Окт-08 01:03 
>>2. Почему не работает форматирование для %2.2d? Это можно исправить?
>
>Потому что так неправильно. Либо "%2.2f", либо "%2d".
>man printf - format specifiers

Да и так он не работает.. :(


"Как получить время заданного форамата (+долисекунды) в С"
Отправлено vic , 30-Окт-08 14:45 
>Могу сделать вывод - надо идти вам в QA.
>1. Смотри ниже.
>2. Согласен, но мне полюбе, так как за это мне не платят
>;)

Учитесь делать правильные выводы. Вам намекают что вы не по адресу обратились с кодом под винду. Вы  же не спрашиваете на форуме фанатов volvo про технические характеристики стиральных машин ?

>3. Добавил.. для меня не критично

а потом самолеты падают, ну это тоже.. не критично.
>5. Ну, эт как посмотреть

а никак не смотреть, правильно \r\n и точка.
>7. Формат не так уж и тяжело подделать

че за бред, я говорю что вы просите один формат, а сами же выводите иначе, т.е. действуете не последовательно, причем тут подделать?

>Получаю в результате:
>Linux: 18:13:55:271892 Seconds???:1225296835
>Windows: 18:13:55:271
>Что по сути правильно, но только вот появились вопросы:
>1. Почему секунды не совпадают в tv.tv_sec?

в tv_sec хранится время с начала эпохи в секундах, с чем оно не совпадает?

>2. Почему не работает форматирование для %2.2d? Это можно исправить?

внимательным чтением документации, разберитесь что значат флаги ширины и точности для каждого типа поля (цифровое, с плавающей точкой, строка) в спецификаторах.
http://www.opennet.me/man.shtml?topic=printf&category=3&russ...
все работает если правильно применять спецификаторы и понимать как именно они влияют на выводимые значения.


"Как получить время заданного форамата (+долисекунды) в С"
Отправлено Serega.M , 30-Окт-08 20:13 
Чего вы такие напряжённые??? Я не собираюсь быть программиром С/С++, тем более в UNIX (хотя очень уважаю данную специфику и людей работающих в ней), так что самолёты из-за меня падать не будут. :) Для меня прежде всего важен конструктивный разговор и результат (имею ввиду на форуме), а все стандарты и т.п. в результате будут соблюдены.
Что же касается вас, то вы лично мне полезной инфы здесь написали два слова: man gettimeofday. Хотя я и до этого сам допёр.

Вот финальный результат моих изысканий:
#include <sys/time.h>
#include <stdio.h>

int main(void)
{
  char buffer[15];
  struct timeval tv;
  time_t curtime;

  gettimeofday(&tv, NULL);
  curtime=tv.tv_sec;
  strftime(buffer,15,"%H.%M.%S",localtime(&curtime));

  printf("\n%s.%02d\n",buffer,tv.tv_usec/10000);

  return 0;
}

Что-то ещё не устраивает в моём коде?


"Как получить время заданного форамата (+долисекунды) в С"
Отправлено Keeper , 30-Окт-08 22:34 
>Что-то ещё не устраивает в моём коде?

Молодец. Пожалуйста, не обижайтесь на тех, кто пытался вам помочь написать хороший кусок кода.


"Как получить время заданного форамата (+долисекунды) в С"
Отправлено Serega.M , 31-Окт-08 11:04 
>>Что-то ещё не устраивает в моём коде?
>
>Молодец. Пожалуйста, не обижайтесь на тех, кто пытался вам помочь написать хороший
>кусок кода.

Спасибо. Я не обижаюсь, просто первый раз сталкиваюсь с таким уровнем мышления. ;)