在c中打印时间戳

问题描述 投票:0回答:1

我在c中使用了以下代码来进行时间戳处理。 新加坡时区应为 UTC+08。但结果却是 0000

time_t now;
time(&now);
char ts[sizeof "1970-01-01T00:00:00+00:00"];
strftime(ts, sizeof ts, "%FT%T%z", gmtime(&now)); 

输出为“2024-03-28T03:20:13+0000” 时间也错了。应该是 11:20,但显示为 03:20。 我该如何改变?

c time time.h
1个回答
0
投票

您似乎正在使用

gmtime()
函数,它将时间转换为协调世界时 (UTC) 时区,因此输出中为“+0000”。要获取新加坡时区 (UTC+08:00) 的时间,您应该使用
localtime()
函数而不是
gmtime()
。不过,由于
localtime()
会针对系统本地时区进行调整,因此您需要手动将其调整为新加坡时区。

以下是修改代码以获取新加坡时区时间的方法:

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

int main() {
    time_t now;
    time(&now);
    
    // Get the time structure in local time zone
    struct tm *local_time = localtime(&now);
    
    // Adjust for Singapore time zone (+08:00)
    local_time->tm_hour += 8;
    
    // Correct hour if it exceeds 24
    if (local_time->tm_hour >= 24) {
        local_time->tm_hour -= 24;
    }
    
    char ts[sizeof "1970-01-01T00:00:00+08:00"];
    strftime(ts, sizeof ts, "%FT%T%z", local_time);
    
    printf("%s\n", ts);
    
    return 0;
}

此代码调整从

localtime()
获取的时间结构的小时以匹配新加坡时区。然后,它使用
strftime()
和“%z”格式说明符来格式化时间戳以包含时区信息。

请注意,此解决方案假设新加坡的时区偏移始终为 UTC+08:00,这在夏令时更改期间可能不准确。如果您需要处理夏令时更改,您可能需要使用更复杂的方法或提供时区处理功能的库。

© www.soinside.com 2019 - 2024. All rights reserved.