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

Posted

技术标签:

【中文标题】使用 C 将当前毫秒转换为时间格式【英文标题】:Convert current milliSecond to time format using C 【发布时间】:2016-11-17 08:01:31 【问题描述】:

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

#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.

但我需要用毫秒打印结果。比如 2016 年 7 月 14 日星期四 17:07:30:40。(17 小时 07 分 30 秒 40 毫秒)

这怎么可能?

【问题讨论】:

C 还是 C++?不一样... 在 C 代码中。我用 gcc 命令编译 【参考方案1】:

its definition 的类型 time_t 不代表以毫秒为单位的时间,函数 localtime 返回指向不包括毫秒的 struct tm 的指针,function strftime 并非旨在生成以毫秒为单位的字符串。

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

【讨论】:

请注意,定义是关于秒的一般性,而不是 C 规范。 time_t 可能会提供亚秒级信息。仍然time_t 作为整数秒计数很常见。【参考方案2】:

将其用作格式字符串:

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

XXX 将按原样复制到时间字符串中。 然后在main中,可以用毫秒计数覆盖Xs。

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

【讨论】:

【参考方案3】:

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

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

创建一个包含 dayOfWeek、month、dayOfMonth、hour、minute、second、milliSecond、year 的结构。 制作一个 convertFunction,它将接收需要转换为您的结构格式的毫秒值。 也许这不是最好的方法,但如果你没有找到使用现有库的方法,请自己制作 .

【讨论】:

【参考方案4】:

... 需要以毫秒为单位打印结果。 ... 怎么可能?

一步一步来

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

【讨论】:

编译此代码时出现错误 "test.c:31:38: error: expected ')' before string constant snprintf(timestamp, sizeof timestamp "%s:%u %s", left , t_ms, right); ^ test.c:31:1: error: too little arguments to function 'snprintf' snprintf(timestamp, sizeof timestamp "%s:%u %s", left, t_ms, right); " @Abdul Manaf Missing , 已添加。 感谢 chux,但我得到了结果“Thu Jul 14 17:07:207 2016”。 @Abdul Manaf 已修改以处理分数。【参考方案5】:

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

【讨论】:

以上是关于使用 C 将当前毫秒转换为时间格式的主要内容,如果未能解决你的问题,请参考以下文章

如何将日期时间转换为时间

将纪元时间(以毫秒为单位)转换为时间戳到 UTC 错误

AIX 转换时间戳

linux怎么将时间戳转换为时间

linux怎么将时间戳转换为时间

vue.js怎样将时间戳转化为日期格式