使用C将当前的milliSecond转换为时间格式

时间:2016-07-14 11:56:55

标签: c timestamp epoch milliseconds

我需要以毫秒为单位将当前时间转换为人类可读的时间格式。我有以下代码

#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);

}

产生结果: Thu Jul 14 17:07:30 2016

但我需要用毫秒打印结果。喜欢 Thu Jul 14 17:07:30:40 2016 。(17小时,07分钟,30秒,40毫秒)

怎么可能?

5 个答案:

答案 0 :(得分:1)

its definition键入time_t并不代表毫秒级分辨率的时间,函数localtime返回指向struct tm的指针,不包括毫秒,function strftime是不是设计用于产生毫秒的字符串。

如果您需要毫秒的时间,则可以使用timeb stucture及其关联的ftime function,如果您的工具链支持这些时间。

答案 1 :(得分: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);

答案 2 :(得分:0)

我还没有50个代表所以我不能发表评论所以我会在这里写下我的建议。

你可以使用他们非常好的其他人的建议,或者你可以使用基本的数学函数制作你自己的结构和一个将mili秒转换成时间的函数。

创建一个包含dayOfWeek,month,dayOfMonth,hour,minute,second,milliSecond,year的结构。 创建一个convertFunction,它将接收需要转换为struct格式的milliSeconds值。 也许它不是最好的方法,但如果你找不到使用现有库的方法,那就自己动手吧。

答案 3 :(得分:0)

  

...需要用毫秒打印结果。 ......怎么可能?

一步一步地采取行动

domain.tld:5000

强大的代码会为每个函数的返回值添加错误检查。

[编辑] OP显然,时间戳的最后3位是分数/ 512。

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);

答案 4 :(得分:0)

此示例程序将同时从其系统OS中检索当前时间戳,并以人类可读的格式将其打印出来。它类似于@user:2410359的答案,但更加简洁。

#include <stdio.h>
#include <time.h>
#include <sys/time.h>

/* 
 * timestamp - read and print the current timestamp
 * Wade Ryan 2020-09-27
 * compile using: g++ timestamp.cpp -o timestamp
 */ 

int main(int argc, char **argv) {
    char   timestamp[24];
    struct timeval currentTime;
    struct tm      ts;

    gettimeofday(&currentTime, NULL);

    long long epoch  =  (unsigned long long)(currentTime.tv_sec) * 1000 +
                        (unsigned long long)(currentTime.tv_usec) / 1000;
        
    strftime(timestamp, sizeof(timestamp), "%F %T", localtime(&currentTime.tv_sec));

    printf("epoch %lld ms :: %s.%03ld\n", epoch, timestamp, currentTime.tv_usec/1000);

}

示例输出:

epoch 1601259041504 ms :: 2020-09-27 21:10:41.504