[c/c++][Linux] 时间戳转换为tm,time_t,timeval

C时间戳解析与转换

ref

https://blog.youkuaiyun.com/GreenTeemo/article/details/102586265

说明

时间戳为2020/03/25 11:09:42 .761197,其中.761197为微秒。

code

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

int main()
{
    char time[100] = "2020/03/25 11:09:42 .761197";
    char time_format[100] = "%Y/%m/%d %H:%M:%S";
    printf("origin  is %s\n", time);

    /* to tm */
    struct tm tm;
    strptime(time, time_format, &tm);
    printf("tm      is %04d-%02d-%02d %02d:%02d:%02d\n", 1900 + tm.tm_year, 1 + tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);

    /* to time_t */
    time_t tt;
    tt = mktime(&tm);
    printf("time_t  is %lu\n", tt);

    /* to timeval */
    struct timeval tv;
    tv.tv_sec = tt;
    tv.tv_usec = atoi(time + 21);		// 21 = strlen("2020/03/25 11:09:42 .")
    printf("timeval is %ld.%06ld\n", tv.tv_sec, tv.tv_usec);

    return 0;
}

output

origin  is 2020/03/25 11:09:42 .761197
tm      is 2020-03-25 11:09:42
time_t  is 1585105782
timeval is 1585105782.761197
`time_t now = time(NULL);` 是C语言中用于获取当前日历时间的标准方法。这行代码的作用是将当前的时间(从1970年1月1日00:00:00 UTC到现在的秒数)存储到变量 `now` 中。 --- ### 代码解析 ```c time_t now = time(NULL); ``` #### 函数原型 ```c time_t time(time_t *timer); ``` - **参数**: - `timer`:如果传入非空指针,函数会将当前时间存储在该指针指向的内存中。 - 如果传入 `NULL`,则函数仅返回当前时间值,不会修改任何内存。 - **返回值**: - 返回自 **Unix纪元(1970年1月1日 00:00:00 UTC)** 以来经过的秒数,类型为 `time_t`。 - 如果系统无法获取当前时间(例如硬件时钟不可用),则返回 `(time_t)(-1)`。 #### 变量类型 - `time_t`:通常是一个整数类型(如 `long` 或 `long long`),用来表示时间戳(以秒为单位)。 --- ### 示例代码 下面是一个完整的示例,展示如何使用 `time()` 函数并打印当前时间: ```c #include <stdio.h> #include <time.h> int main() { time_t now = time(NULL); // 获取当前时间戳 if (now == (time_t)(-1)) { perror("无法获取当前时间"); return 1; } printf("当前时间戳(秒): %ld\n", (long)now); // 将时间戳转换为可读格式 struct tm *local_time = localtime(&now); char buffer[80]; strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local_time); printf("本地时间: %s\n", buffer); return 0; } ``` #### 输出示例: ``` 当前时间戳(秒): 1723567890 本地时间: 2025-08-13 12:31:30 ``` --- ### 使用场景 1. **日志记录**:记录事件发生的时间戳。 2. **性能监控**:测量代码执行时间。 3. **超时控制**:实现基于时间的逻辑控制。 4. **生成唯一ID**:结合其他信息生成伪唯一标识符。 --- ### 注意事项 - `time()` 的精度为秒,如果需要更高精度的时间(如毫秒或微秒),可以使用以下方法: - **`gettimeofday()`(POSIX)**: ```c struct timeval tv; gettimeofday(&tv, NULL); double current_time = tv.tv_sec + tv.tv_usec / 1e6; ``` - **`clock_gettime()`(POSIX)**(推荐): ```c struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); double current_time = ts.tv_sec + ts.tv_nsec / 1e9; ``` - **`std::chrono`(C++)**:C++中更现代的时间处理方式。 - `time()` 返回的时间是基于系统时钟的,如果系统时钟被修改,时间戳也会受到影响。 --- ### 总结 `time_t now = time(NULL);` 是获取当前时间的一种简单且常用的方式。它适用于大多数不需要高精度时间的应用场景。对于需要更高精度或更复杂时间处理的场景,可以使用更高级的API如 `clock_gettime()` 或 `gettimeofday()`。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值