2016-07-14 2 views
3

Мне нужно прокрутить текущее время в миллисекундах до формата для чтения человеком. У меня следующий кодПреобразование текущего миллисекунды во временный формат с использованием C

#include <netinet/in.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <stdbool.h> 
#include <sys/time.h> 
#include <time.h> 

int Cnvrt_To_Time_Frmt(char *Epochval) 
{ 
    unsigned long epoch = 0; 
    time_t tt = 0; 
    char timestamp[64],usec_buf[20]; 
    if (!sscanf(Epochval, "%lu", &epoch)) 
    { 
     return 1; 
    } 
    tt = epoch; 

    strftime(timestamp, 64, "%c", localtime(&tt)); 
    printf("%s\n",timestamp); 
    return 0; 
} 

int main() 
{ 
    uint64_t Epoch_time=1468496250207; 
    char str_ms[256]; 
    sprintf(str_ms, "%llu", (Epoch_time/1000)); 
    Cnvrt_To_Time_Frmt(str_ms); 

} 

Он производит результат: Чт Июл 14 17:07:30 2016.

Но мне нужно распечатать результат с миллисекунд. например, Чт 14 июля 17: 07: 30: 40 2016. (17 час, 07 минут, 30 секунд, 40 миллисекунд)

Как это будет возможно?

+1

C или C++? Не то же самое ... –

+0

в коде C.i компилировать с помощью команды gcc –

ответ

1

Тип time_t по its definition не представляет времени с разрешением миллисекунды, функция localtime возвращает указатель на struct tm, который не включает миллисекунды, function strftime не предназначен для получения строк с миллисекундах.

Если вам нужно время с миллисекундами, вы можете использовать timeb stucture со связанным с ним ftime function, если они поддерживаются вашей цепочкой инструментов.

1

использовать это в качестве строки формата:

strftime(timestamp, 64, "%a %b %d %H:%M:%S.XXX %Y", localtime(&tt)); 

XXX будут скопированы как есть в строки времени. Затем в main вы можете переписать X с миллисекундным счетом.

sprintf(&timestamp[20], "%03u", (unsigned)Epoch_time%1000); 
timestamp[23] = ' '; // restore the NUL to space again 

После этого, реорганизовать код, подразделения и операции Остаточные выполняются внутри Cnvrt_To_Time_Frmt. Вы можете использовать это в качестве прототипа:

int msecs_tostr(char *buffer, const char *msecs_since_epoch); 
0

У меня нет 50 повторений еще и поэтому я не могу комментировать, так что я буду писать мое предложение как ответ здесь.

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

Создайте структуру, которая содержит dayOfWeek, месяц, деньOfMonth, час, минута, секунда, миллисекунд, год. Сделайте функцию convertFunction, которая получит значение миллисекунд, которое необходимо преобразовать в формат структуры. Возможно, это не лучший способ сделать это, но если вы не нашли способ использовать существующие библиотеки, сделайте свой собственный.

0

... need to print result with milli seconds. ... How it will be possible?

Возьмите его шаг за шагом

uint64_t Epoch_time=1468496250207; 

// Break time into a whole number of seconds and ms fraction 
time_t t_unix = Epoch_time/1000; 
unsigned t_ms = Epoch_time%1000; 

// Convert to YMD HMS structure 
struct tm tm = *localtime(&t_unix); 

// Form left portion of string 
char left[64]; 
strftime(left, sizeof left, "%a %b %d %H:%M", &tm); 

// Form right portion of string 
char right[20]; 
strftime(right, sizeof right, "%Y", &tm); 

// Put together with ms 
char timestamp[64]; 
snprintf(timestamp, sizeof timestamp, "%s:%u %s", left, t_ms, right); 

// Thu Jul 14 17:07:30:40 2016 
// Print as needed 
puts(timestamp); 

Надежный код добавит проверки ошибок с возвращаемым значением каждой функции.


[править] Очевидно Op ПОРА штампа последние 3 цифры фракция/512.

unsigned t_fraction = Epoch_time%1000; 
... 
snprintf(timestamp, sizeof timestamp, "%s:%02u %s", left, t_fraction*100/512, right); 
+0

У меня возникла ошибка при компиляции этого кода «test.c: 31: 38: error: expected») перед строковой константой snprintf (timestamp, sizeof timestamp «% s:% u% s», t_ms, right); ^ test.c: 31: 1: ошибка: слишком мало аргументов для функции 'snprintf' snprintf (временная метка, размер временной метки "% s:% u% s", слева, t_ms, справа); " –

+0

@ Abdul Manaf Missing', 'добавлено. – chux

+0

спасибо chux, Но я получил результат «Thu Jul 14 17: 07: 207 2016». –