C语言格式化输出日期时间

例程

其实函数就那么几个,具体方法也不少,以下列出几种:

#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

你可能感兴趣的:(#,ESP32,#,ESP8266,#,C语言,C语言,格式化,时间)