使用C将当前毫秒转换为时间格式

nzk0hqpo  于 2023-02-21  发布在  其他
关注(0)|答案(5)|浏览(201)

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

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

}

它产生结果:* 2016年7月14日星期四17:07:30 *。
但我需要以毫秒打印结果。如 * 2016年7月14日星期四17:07:30:40 *。(17小时07分钟30秒40毫秒)
怎么可能呢?

bq8i3lrv

bq8i3lrv1#

类型time_t by its definition不表示毫秒分辨率的时间,函数localtime返回指向struct tm的指针,该指针不包括毫秒,function strftime不用于生成毫秒字符串。
如果你需要毫秒级的时间,你可以使用timeb stucture及其关联的ftime function,如果你的工具链支持的话。

pw9qyyiw

pw9qyyiw2#

将此用作格式字符串:

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

s5a0g9ez3#

  • 我还没有50个代表,所以我不能发表评论,所以我会写我的建议作为答案在这里。*

你可以使用其他人的建议,他们是相当不错的,或者你可以使自己的结构和一个函数,转换成时间的毫秒,通过使用基本的数学函数。
创建一个包含dayOfWeek,month,dayOfMonth,hour,minute,second,milliSecond,year的结构体。创建一个convertFunction,它将接收一个需要转换为结构体格式的milliSeconds值。也许这不是最好的方法,但是如果你找不到使用现有库的方法,那么创建你自己的库。

vom3gejh

vom3gejh4#

......需要以毫秒打印结果。......这怎么可能?
一步一步来

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

dtcbnfnu5#

这个示例程序将从系统操作系统中检索当前时间戳,并以人类可读的格式打印出来。它类似于@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

相关问题