获取当前系统时间(C语言版)
将当前系统时间打印在代码中,此文作为记录,如有问题欢迎提出
代码记录:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
int main() {
struct tm *localTime;
struct timeval tv;
// 设置时区为中国标准时间 (UTC+8)
setenv("TZ", "Asia/Shanghai", 1);
tzset();
// 获取当前系统时间
gettimeofday(&tv, NULL);
localTime = localtime(&tv.tv_sec);
long utcOffsetSeconds = localTime->tm_gmtoff; // 提取时区偏移量
int utcOffsetHours = utcOffsetSeconds / 3600; // 将偏移量转换为小时
int utcOffsetMinutes = (utcOffsetSeconds % 3600) / 60; // 将偏移量转换为分钟
printf( "UTC offset %+.2d:%.2d %04d-%02d-%02d: %02d:%02d:%02d:%03d",
utcOffsetHours, utcOffsetMinutes,
localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday,
localTime->tm_hour, localTime->tm_min, localTime->tm_sec, tv.tv_usec / 1000);
return 0;
}
程序中将使用gettimeofday()函数获取当前时间,并使用localtime()函数将其转换为本地时间结构体struct tm。然后,通过访问tm_year、tm_mon和tm_mday字段,可以获取当前的年、月和日,并以指定格式打印出来
运行结果:UTC offset +08:00 2023-11-11: 09:57:43:309
如已知UTC时间偏移量,也可以在localtime函数执行前手动修改, 以时区偏移量为8举例,将其转换成秒,示例如下:
struct tm *localTime;
struct timeval tv;
gettimeofday(&tv, NULL);
time_t currentTime = tv.tv_sec + 8*60*60;
localTime = localtime(¤tTime);
参数介绍
1.struct tm 结构体
struct tm 结构体用于表示本地时间,可以通过使用 <time.h> 中的函数,如 localtime() 和 gmtime() 将时间转换为 struct tm 结构体,并使用 strftime() 函数将其格式化为字符串。
用localtime函数将时间数值变换成本地时间,考虑到本地时区和夏令时标志;
以下是 struct tm 的成员变量:
struct tm
{
int tm_sec; /* Seconds. [0-60] (1 leap second) */
int tm_min; /* Minutes. [0-59] */
int tm_hour; /* Hours. [0-23] */
int tm_mday; /* Day. [1-31] */
int tm_mon; /* Month. [0-11] */
int tm_year; /* Year - 1900. */
int tm_wday; /* Day of week. [0-6] */
int tm_yday; /* Days in year.[0-365] */
int tm_isdst; /* DST. [-1/0/1]*/
# ifdef __USE_MISC
long int tm_gmtoff; /* Seconds east of UTC. */
const char *tm_zone; /* Timezone abbreviation. */
# else
long int __tm_gmtoff; /* Seconds east of UTC. */
const char *__tm_zone; /* Timezone abbreviation. */
# endif
};
2. gettimeofday()函数
gettimeofday() 用于获取当前时间的精确值。它返回了一个 struct timeval 结构体,其中包含秒数和微秒数。
以下是 struct timeval 的成员变量:
time_t tv_sec:表示从1970年1月1日开始的秒数(UNIX 时间戳)
suseconds_t tv_usec:表示微秒数