例程
其实函数就那么几个,具体方法也不少,以下列出几种:
#include "stdio.h"
#include "sys/time.h"
char timestr[128]="";
time_t now;
//方法1
// now = time( 0 );
int main()
{
//设置时区(不一定有用)
setenv("TZ", "GMT-8", 1);
tzset();
//方法1
time(&now);
strftime(timestr, 128, "%a, %d %b %Y %H:%M:%S GMT", localtime(&now));
printf("strftime(fmt localtime(&now))Date&Time:%s\r\n", timestr);
//方法2
struct tm *p;
now = time( 0 );
p=gmtime(&now); //无时区信息
strftime(timestr, 128, "%Y-%m-%d %H:%M:%S", p);
printf("strftime(fmt gmtime(&now))Date&Time:%s\r\n", timestr);
printf("p->tm_hour:p->tm_min:p->tm_sec >>> %02d:%02d:%02d\r\n",p->tm_hour,p->tm_min,p->tm_sec);
//方法3
struct tm timeinfo;
time_t t = time( 0 );
timeinfo = *localtime(&now);
printf("Date&Time:%04d-%02d-%02d,%02d:%02d:%02d",1900+(timeinfo.tm_year), (timeinfo.tm_mon)+1,timeinfo.tm_mday, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
//方法4
struct timeval tv_now;
gettimeofday(&tv_now, NULL);
localtime_r(&tv_now.tv_sec, &timeinfo);
printf("Date&Time:%04d-%02d-%02d,%02d:%02d:%02d",1900+(timeinfo.tm_year), (timeinfo.tm_mon)+1,timeinfo.tm_mday, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
//如果需要时区转换,那么
uint16_t offset = 28800; //8*60*60 即8小时对应的秒数
time_t localtimestamp = now + offset;
}
struct timeval结构体
struct timeval结构体在time.h中的定义为:
struct timespec {
time_t tv_sec; /* Seconds */
long tv_nsec; /* Nanoseconds */
};
其中,tv_sec为Epoch到创建struct timeval时的秒数,tv_usec为微秒数。
strftime()
函数
获取日期不同格式的最快方法是使用strftime()
函数
它根据 format 中定义的格式化规则,格式化结构 timeptr 表示的时间,并把它存储在 str 中。
声明
下面是 strftime() 函数的声明。
size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)
参数
- str – 这是指向目标数组的指针,用来复制产生的 C 字符串。
- maxsize – 这是被复制到 str 的最大字符数。
- format – 这是 C 字符串,包含了普通字符和特殊格式说明符的任何组合。这些格式说明符由函数替换为表示 tm 中所指定时间的相对应值。格式说明符是:
说明符 | 替换为 | 实例 |
%a | 缩写的星期几名称 | Sun |
%A | 完整的星期几名称 | Sunday |
%b | 缩写的月份名称 | Mar |
%B | 完整的月份名称 | March |
%c | 日期和时间表示法 | Sun Aug 19 02:56:02 2012 |
%d | 一月中的第几天(01-31) | 19 |
%H | 24 小时格式的小时(00-23) | 14 |
%I | 12 小时格式的小时(01-12) | 05 |
%j | 一年中的第几天(001-366) | 231 |
%m | 十进制数表示的月份(01-12) | 08 |
%M | 分(00-59) | 55 |
%p | AM 或 PM 名称 | PM |
%S | 秒(00-61) | 02 |
%U | 一年中的第几周,以第一个星期日作为第一周的第一天(00-53) | 33 |
%w | 十进制数表示的星期几,星期日表示为 0(0-6) | 4 |
%W | 一年中的第几周,以第一个星期一作为第一周的第一天(00-53) | 34 |
%x | 日期表示法 | 08/19/12 |
%X | 时间表示法 | 02:50:06 |
%y | 年份,最后两个数字(00-99) | 01 |
%Y | 年份 | 2012 |
%Z | 时区的名称或缩写 | CDT |
%% | 一个 % 符号 | % |
- timeptr – 这是指向 tm 结构的指针,该结构包含了一个被分解为以下各部分的日历时间(如上文例程中的
struct tm timeinfo
):
struct tm {
int tm_sec; /* 秒,范围从 0 到 59 */
int tm_min; /* 分,范围从 0 到 59 */
int tm_hour; /* 小时,范围从 0 到 23 */
int tm_mday; /* 一月中的第几天,范围从 1 到 31 */
int tm_mon; /* 月份,范围从 0 到 11 */
int tm_year; /* 自 1900 起的年数 */
int tm_wday; /* 一周中的第几天,范围从 0 到 6 */
int tm_yday; /* 一年中的第几天,范围从 0 到 365 */
int tm_isdst; /* 夏令时 */
};
注:
如要使用struct timeval 结构体
,那么需要包含sys/time.h
文件而非time.h