我在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分. 我该如何进行更改?

推荐答案

看起来您正在使用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()获得的时间 struct 的小时,以匹配新加坡时区.然后,它使用带有"% z"格式说明符的strftime()来格式化时间戳,以包括时区信息.

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

C++相关问答推荐

char为16位且Short也为16位的c环境合法吗

漏洞仅出现在FreeBSD上,但在Windows、Linux和MacOS上运行得非常好

为什么我得到更多的256假阳性在PKZIP解密密钥验证?

增加getaddrinfo返回的IP地址数量

C:fopen是如何实现二进制模式和文本模式的?

为什么sscanf不能正确地从这个字符串格式中提取所有数字?

使用C时,Windows CMD中的argc参数是否包含重定向命令?

为什么我会收到释放后堆使用错误?

在另一个函数中使用realloc和指针指向指针

使用TCL C API导航到列表中的元素

如何在GET_STRING输入后对少数几个特定字符串进行C判断?

S在本文中的价值观到底出了什么问题?

将字符串数组传递给C中的函数:`str[dim1][str_size]`vs`*str[dim1]`

我在反转双向链表时遇到问题

C堆栈(使用动态数组)realloc内存泄漏问题

不同原型的危险C函数是可能的

如何在zOS上编译共享C库

将非连续物理内存映射到用户空间

Linux memcpy 限制关键字语法

为什么实现文件中的自由函数默认没有内部链接?