C语言 Unix 时间戳 和 时间日期相互转换

Unix 时间戳(也称为 POSIX 时间戳)是一个表示从 1970 年 1 月 1 日 UTC 时刻开始所经过的秒数的数值。这个时间戳是与时间区域无关的,也就是说它在全球任何地方都表示同一个时刻。

如果你要将 Unix 时间戳转换为某个特定时区的时间,你需要考虑该时区相对于 UTC 的偏移量。对于东八区(即 UTC+8),你确实需要在 Unix 时间戳的基础上加上 8 小时的秒数来得到当地的时间。

一般来说,对于不同的时区,处理方法如下:

UTC+X (东部时区):在 Unix 时间戳基础上加 X 小时。
UTC-X (西部时区):在 Unix 时间戳基础上减 X 小时。
例如:
如果你想得到 UTC+3(如莫斯科)的时间,你需要在 Unix 时间戳基础上加上 3 小时。
如果你想得到 UTC-5(如美国东部标准时间 EST)的时间,你需要在 Unix 时间戳基础上减去 5 小时。

1.时间日期转成时间戳

在 C 语言中,<time.h> 头文件提供了日期和时间处理的功能

注意:
Unix 时间戳是从 1970 年 1 月 1 日 00:00:00 UTC 开始计算的,而不是从 1900 年开始。
在 C 语言中,struct tm 结构体用于存储分解后的日期和时间信息。tm_year 成员表示从 1900 年开始的年数,这是因为 struct tm 结构体的设计是为了与早期的日期和时间处理标准兼容,而不是直接与 Unix 时间戳相关联。

struct tm 结构体成员
struct tm 的成员包括但不限于:

  • tm_sec:秒 (0-60)
  • tm_min:分钟 (0-59)
  • tm_hour:小时 (0-23)
  • tm_mday:一个月中的哪一天 (1-31)
  • tm_mon:月份 (0-11),0 表示一月
  • tm_year:从 1900 年开始的年数
  • tm_wday:一周中的哪一天 (0-6),0 表示周日
  • tm_yday:一年中的哪一天 (0-365)
  • tm_isdst:夏令时标志 (-1 表示未知,0 表示不适用,1 表示适用)

在线运行C语言工具

#include <stdlib.h>
#include <time.h>
 
int main()
{
    struct tm my_time = {0};
    time_t timestamp;

    // 设置时间
    my_time.tm_year = 2024 - 1900; // 注意:tm_year 是从 1900 年开始计算的
    my_time.tm_mon = 8 - 1;         // 注意:tm_mon 是从 0 开始的
    my_time.tm_mday = 6;
    my_time.tm_hour = 19;
    my_time.tm_min = 20;
    my_time.tm_sec = 20;

    // 调用 mktime 函数
    timestamp = mktime(&my_time);

    // 检查 mktime 是否成功
    if (timestamp == -1) {
        perror("mktime failed");
        return 1;
    }

    // 打印时间戳
    printf("Timestamp: %ld\n", (long)timestamp);

    return 0;
}

输出结果:Timestamp: 1722972020

换算结果是正确的
unix时间戳在线转换工具
在这里插入图片描述

2.时间戳转成时间日期(方法1)

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

int main()
{
    time_t timestamp;
    struct tm *timeinfo;
    char buffer[20];

    // 假设这是你的时间戳
    timestamp = 1691365220; // 2023-08-06 23:40:20

    // 使用 localtime 函数
    timeinfo = localtime(&timestamp);

    // 使用 strftime 格式化日期和时间
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", timeinfo);

    // 打印日期和时间
    printf("Local Date and Time: %s\n", buffer);

    return 0;
}

Local Date and Time: 2023-08-06 23:40:20

3.时间戳转成时间日期(方法2)

asctime 函数会将 struct tm 结构体转换为一个包含完整日期和时间的字符串,并以 "\n" 结尾。

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

int main()
{
    time_t timestamp;
    struct tm *timeinfo;

    // 假设这是你的时间戳
    timestamp = 1722972020; // 2024-08-06 19:20:20

    // 使用 gmtime 函数
    timeinfo = gmtime(&timestamp);

    // 打印日期和时间
    printf("UTC Date and Time: %s", asctime(timeinfo));

    return 0;
}

UTC Date and Time: Tue Aug 6 19:20:20 2024

<think>我们使用C语言Unix时间戳转换为本地时间格式。 Unix时间戳是从1970年1月1日00:00:00 UTC开始所经过的秒数(不考虑闰秒)。 我们可以使用localtime函数将时间戳转换为本地时间的tm结构体,然后使用strftime函数格式化为字符串。 步骤: 1. 包含必要的头文件:<time.h>,<stdio.h> 2. 获取Unix时间戳(通常是一个长整型,如time_t类型) 3. 使用localtime将时间戳转换为本地时间的struct tm结构体 4. 使用strftime将struct tm格式化为字符串 示例代码: ```c #include <stdio.h> #include <time.h> int main() { // 假设我们有一个Unix时间戳 time_t rawtime = 1617187200; // 例如:2021-03-31 00:00:00 UTC // 转换为本地时间 struct tm * timeinfo = localtime(&rawtime); // 格式化时间 char buffer[80]; strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", timeinfo); printf("日期时间: %s\n", buffer); return 0; } ``` 注意:localtime函数返回一个指向静态分配的结构体的指针,所以不需要手动释放内存,但要注意它是不可重入的(在多线程环境中可以使用localtime_r)。 格式说明符: %Y - 年份(四位数) %m - 月份(01-12) %d - 日(01-31) %H - 小时(24小时制,00-23) %M - 分钟(00-59) %S - 秒(00-61,允许闰秒) 如果需要UTC时间,可以使用gmtime代替localtime。 §§相关问题§§ 1. 如何将当前时间转换Unix时间戳? 2. strftime函数支持哪些常用的时间格式化选项? 3. 在C语言中如何处理时区转换? 4. 在多线程环境下使用localtime是否安全?如果不安全,应该使用什么替代函数? </think>### C语言Unix时间戳转换时间格式 在C语言中,可以使用 `<time.h>` 标准库实现Unix时间戳到本地时间格式的转换Unix时间戳是从1970年1月1日00:00:00 UTC起经过的秒数。 #### 核心步骤: 1. 包含头文件:`#include <time.h>` 2. 使用 `localtime()` 将时间戳转换为 `struct tm` 结构体 3. 用 `strftime()` 格式化时间为字符串 #### 示例代码: ```c #include <stdio.h> #include <time.h> int main() { // Unix时间戳(例如:1717027200 表示 2024-05-30 00:00:00 UTC) time_t timestamp = 1717027200; // 转换为本地时间结构体 struct tm *timeinfo = localtime(&timestamp); // 格式化时间字符串 char buffer[80]; strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", timeinfo); printf("转换结果: %s\n", buffer); // 输出:2024-05-30 08:00:00(北京时间+8) return 0; } ``` #### 关键说明: - **`strftime` 格式说明符**: - `%Y`:四位年份(如2024) - `%m`:两位月份(01-12) - `%d`:两位日期(01-31) - `%H`:24小时制小时(00-23) - `%M`:分钟(00-59) - `%S`:秒(00-59) - **时区处理**: - `localtime()` 自动转换到系统时区 - 需UTC时间时改用 `gmtime()` - **输出示例**: ```bash 转换结果: 2024-05-30 08:00:00 # 北京时间(UTC+8) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值