第1部分 重新认识C语言
localtime与GetLocalTime
【文章摘要】
在C语言中,有两个获取当前时间的函数:localtime和GetLocalTime。它们在诸如对账一类的程序中应用很广。
本文对localtime和GetLocalTime进行较为详细的介绍,并举例说明它们的用法。
【关键词】
localtime GetLocalTime 日期 时间
1.前言
在C语言中,获取当前系统时间的操作时有发生。例如,在对账程序中,需要在对账文件名中加入当天的日期及时间。一般而言,经常使用的获取当前时间的函数有两个:localtime和GetLocalTime。
本文分别介绍了localtime和GetLocalTime函数,并举例说明了它们的用法。
2. localtime和GetLocalTime函数介绍
2.1 localtime函数介绍
功能:把从1970-1-1零点零分(程序中是从1900年开始算的)到当前时间系统所偏移的秒数时间转换为日历时间。
说明:此函数获得的tm结构体的时间,已经进行过时区转化,成为了本地时间。
用法:struct tm *localtime(const time_t *clock)。
返回值:返回指向tm结构体的指针。
tm结构体是time.h中定义的用于分别存储时间的各个量(年月日等)的结构体,其定义如下:
#ifndef _TM_DEFINED
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代表一月) -取值区间为[0,11] */
int tm_year; /*年份,其值从1900开始 */
int tm_wday; /*星期–取值区间为[0,6],其中0代表星期天,1代表星期一,等等 */
int tm_yday; /*从每年的1月1日开始的天数–取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */
int tm_isdst; /*夏令时标识符,实行夏令时的时候,tm_isdst为正;不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负 */
long int tm_gmtoff; /*指定了日期变更线东面时区中UTC东部时区正秒数或UTC西部时区的负秒数*/
const char *tm_zone; /*当前时区的名字(与环境变量TZ有关)*/
};
#define _TM_DEFINED
#endif
2.2 GetLocalTime函数介绍
函数功能:该函数用来获取当地的当前系统日期和时间。
函数原型:void GetLocalTime(LPSYSTEMTIME lpSystemTime // address of system times structure);
参数说明:
lpSystemTime:指向一个用户自定义包含日期和时间信息的类型为SYSTEMTIME的变量,该变量用来保存函数获取的时间信息。
SYSTEMTIME结构体的定义如下:
typedef struct _SYSTEMTIME
{
WORD wYear; //年
WORD wMonth; //月
WORD wDayOfWeek; //星期,0为星期日,1为星期一,2为星期二……
WORD wDay; //日
WORD wHour; //时
WORD wMinute; //分
WORD wSecond; //秒
WORD wMilliseconds; //毫秒
}SYSTEMTIME,*PSYSTEMTIME;
3. localtime和GetLocalTime函数应用举例
3.1例子程序
包含localtime和GetLocalTime函数的例子程序如下:
//用于测试时间函数
#include <afxinet.h>
typedef signed int INT32; // 重定义数据类型
/****************************************************************
*功能描述: 主函数 *
*输入参数: 无 *
*输出参数: 无 *
*返 回 值:无 *
*其他说明: 无 *
*修改日期 版本号 修改人 修改内容
* ------------------------------------------------------------------------------
* 20140409 V1.0 zzx 创建
****************************************************************/
INT32 main(void)
{
//用于GetLocalTime输入参数
INT32 iGetLocalTimeDate = 0;
INT32 iGetLocalTimeTime = 0;
//用于localtime输入参数
INT32 iLocalTimeDate = 0;
INT32 iLocalTimeTime = 0;
time_t now;
struct tm today;
SYSTEMTIME sysTime;
//使用GetLocalTime函数获取日期和时间 begin
{
GetLocalTime(&sysTime);
iGetLocalTimeDate = sysTime.wYear * 10000 + sysTime.wMonth * 100 + sysTime.wDay;
iGetLocalTimeTime = sysTime.wHour * 10000 + sysTime.wMinute * 100 + sysTime.wSecond;
}
//使用GetLocalTime函数获取日期和时间 end
//使用localtime函数获取日期和时间 begin
{
time(&now);
today = *localtime(&now);
iLocalTimeDate = (1900 + today.tm_year) * 10000 + (1 + today.tm_mon) * 100 + today.tm_mday;
iLocalTimeTime = today.tm_hour * 10000 + today.tm_min * 100 + today.tm_sec;
}
//使用localtime函数获取日期和时间 end
//先比较日期
if (iGetLocalTimeDate == iLocalTimeDate)
{
printf("The date is the same, it is %04d年%02d月%02d日.\n", sysTime.wYear, sysTime.wMonth, sysTime.wDay);
}
else
{
printf("The date is not the same. In UseGetLocalTime(), it is %d. In UseLocalTime(), it is %d.\n", iGetLocalTimeDate, iLocalTimeDate);
}
//再比较时间
if (iGetLocalTimeTime == iLocalTimeTime)
{
printf("The time is the same, it is %02d:%02d:%02d.\n", sysTime.wHour, sysTime.wMinute, sysTime.wSecond);
}
else
{
printf("The time is not the same. In UseGetLocalTime(), it is %d. In UseLocalTime(), it is %d.\n", iGetLocalTimeTime, iLocalTimeTime);
}
printf("Local time is %s", asctime(&today));
printf("It is the %d day of week.\n", sysTime.wDayOfWeek);
return 0;
}
3.2程序说明
本例子程序包含如下操作:
(1)用GetLocalTime函数获取当前日期和时间,其中日期存放在变量iGetLocalTimeDate中(格式为:yyyymmdd),时间存放在变量iGetLocalTimeTime中(格式为:hhmmss)。
(2)用localtime函数获取当前日期和时间,其中日期存放在变量iLocalTimeDate中(格式为:yyyymmdd),时间存放在变量iLocalTimeTime中(格式为:hhmmss)。
(3)比较用这两个函数获得的日期和时间是否相同。若相同,则将日期和时间分别打印出来;若不相同,则分别将用这两个函数获得的日期和时间打印出来。
(4)用asctime函数转换日期和时间为相应的ASCII码,返回字符串格式为:星期,月,日,小时,分,秒,年。
(5)调用sysTime.wDayOfWeek打印当前日期是一周中的第几天。
3.3程序输出
本例子程序的输出结果如下:
4.总结
“条条大路通罗马”,要做成功一件事情,我们可能会有很多种方法。
在C语言中,常用的获取当前时间的函数有localtime和GetLocalTime两个。经过程序测试表明,只要用法正确,它们获取的日期和时间结果就是相同的。
(欢迎访问南邮BBS:http://bbs.njupt.edu.cn/)
(欢迎访问重邮BBS:http://bbs.cqupt.edu.cn/nForum/index)
(本系列文章每周更新两篇,敬请期待!本人新浪微博:http://weibo.com/zhouzxi?topnav=1&wvr=5,微信号:245924426,欢迎关注!)