C语言的标准库
函数包括一系列日期和时间处理函数,它们都在头文件中说明。下面列出了这些函数。在头文件中定义了三种类型:time_t,struct tm和clock_t。
在中说明的C语言时间函数
time_t time(time_t timer);
double difftime(time_t time1,time_t time2);
struct tm gmtime(const time_t timer);
struct tm localtime(const time_t timer);
char asctime(const struct tm timeptr);
char ctime(const time_t timer);
size_t strftime(char s,size_t maxsize,const char format,const struct tm timeptr);
time_t mktime(struct tm timeptr);
clock_t clock(void);
下面是我从网上收集到的时间函数集
asctime(将时间和日期以字符串格式表示)
相关函数
time,ctime,gmtime,localtime
表头文件
#i nclude
定义函数
char asctime(const struct tm timeptr);
函数说明
asctime()将参数timeptr所指的tm结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回。此函数已经由时区转换成当地时间,字符串格式为:"Wed Jun 30 21:49:08 1993\n"
返回值
若再调用相关的时间日期函数,此字符串可能会被破坏。此函数与ctime不同处在于传入的参数是不同的结构。
附加说明
返回一字符串表示目前当地的时间日期。
范例
#i nclude
main()
{
time_t timep;
time (&timep);
printf("%s",asctime(gmtime(&timep)));
}
执行
Sat Oct 28 02:10:06 2000
ctime(将时间和日期以字符串格式表示)
相关函数
time,asctime,gmtime,localtime
表头文件
#i nclude
定义函数
char ctime(const time_t timep);
函数说明
ctime ()将参数timep所指的time_t结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回。此函数已经由时区转换成当地时间,字符串格式为"Wed Jun 30 21 :49 :08 1993\n"。若再调用相关的时间日期函数,此字符串可能会被破坏。
返回值
返回一字符串表示目前当地的时间日期。
范例
#i nclude
main()
{
time_t timep;
time (&timep);
printf("%s",ctime(&timep));
}
执行
Sat Oct 28 10 : 12 : 05 2000
gettimeofday(取得目前的时间)
相关函数
time,ctime,ftime,settimeofday
表头文件
#i nclude
#i nclude
定义函数
int gettimeofday ( struct timeval tv , struct timezone tz )
函数说明
gettimeofday()会把目前的时间有tv所指的结构返回,当地时区的信息则放到tz所指的结构中。
timeval结构定义为:
struct timeval{
long tv_sec; /秒/
long tv_usec; /微秒/
};
timezone 结构定义为:
struct timezone{
int tz_minuteswest; /和Greenwich 时间差了多少分钟/
int tz_dsttime; /日光节约时间的状态/
};
上述两个结构都定义在/usr/include/sys/timeh。tz_dsttime 所代表的状态如下
DST_NONE /不使用/
DST_USA /美国/
DST_AUST /澳洲/
DST_WET /西欧/
DST_MET /中欧/
DST_EET /东欧/
DST_CAN /加拿大/
DST_GB /大不列颠/
DST_RUM /罗马尼亚/
DST_TUR /土耳其/
DST_AUSTALT /澳洲(1986年以后)/
返回值
成功则返回0,失败返回-1,错误代码存于errno。附加说明EFAULT指针tv和tz所指的内存空间超出存取权限。
范例
#i nclude
#i nclude
main(){
struct timeval tv;
struct timezone tz;
gettimeofday (&tv , &tz);
printf("tv_sec; %d\n", tv,tv_sec) ;
printf("tv_usec; %d\n",tvtv_usec);
printf("tz_minuteswest; %d\n", tztz_minuteswest);
printf("tz_dsttime, %d\n",tztz_dsttime);
}
执行
tv_sec: 974857339
tv_usec:136996
tz_minuteswest:-540
tz_dsttime:0
gmtime(取得目前时间和日期)
相关函数
time,asctime,ctime,localtime
表头文件
#i nclude
定义函数
struct tmgmtime(const time_ttimep);
函数说明
gmtime()将参数timep 所指的time_t 结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果由结构tm返回。
结构tm的定义为
struct tm
{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};
int tm_sec 代表目前秒数,正常范围为0-59,但允许至61秒
int tm_min 代表目前分数,范围0-59
int tm_hour 从午夜算起的时数,范围为0-23
int tm_mday 目前月份的日数,范围01-31
int tm_mon 代表目前月份,从一月算起,范围从0-11
int tm_year 从1900 年算起至今的年数
int tm_wday 一星期的日数,从星期一算起,范围为0-6
int tm_yday 从今年1月1日算起至今的天数,范围为0-365
int tm_isdst 日光节约时间的旗标
此函数返回的时间日期未经时区转换,而是UTC时间。
返回值
返回结构tm代表目前UTC 时间
范例
#i nclude
main(){
char wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
time_t timep;
struct tm p;
time(&timep);
p=gmtime(&timep);
printf("%d%d%d",(1900+p->tm_year), (1+p->tm_mon),p->tm_mday);
printf("%s%d;%d;%d\n", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);
}
执行
2000/10/28 Sat 8:15:38
localtime(取得当地目前时间和日期)
相关函数
time, asctime, ctime, gmtime
表头文件
#i nclude
定义函数
struct tm localtime(const time_t timep);
函数说明
localtime()将参数timep所指的time_t结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果由结构tm返回。结构tm的定义请参考gmtime()。此函数返回的时间日期已经转换成当地时区。
返回值
返回结构tm代表目前的当地时间。
范例
#i nclude
main(){
char wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
time_t timep;
struct tm p;
time(&timep);
p=localtime(&timep); /取得当地时间/
printf ("%d%d%d ", (1900+p->tm_year),( l+p->tm_mon), p->tm_mday);
printf("%s%d:%d:%d\n", wday[p->tm_wday],p->tm_hour, p->tm_min, p->tm_sec);
}
执行
2000/10/28 Sat 11:12:22
mktime(将时间结构数据转换成经过的秒数)
相关函数
time,asctime,gmtime,localtime
表头文件
#i nclude
定义函数
time_t mktime(strcut tm timeptr);
函数说明
mktime()用来将参数timeptr所指的tm结构数据转换成从公元1970年1月1日0时0分0 秒算起至今的UTC时间所经过的秒数。
返回值
返回经过的秒数。
范例
/ 用time()取得时间(秒数),利用localtime()
转换成struct tm 再利用mktine()将struct tm转换成原来的秒数/
#i nclude
main()
{
time_t timep;
strcut tm p;
time(&timep);
printf("time() : %d \n",timep);
p=localtime(&timep);
timep = mktime(p);
printf("time()->localtime()->mktime():%d\n",timep);
}
执行
time():974943297
time()->localtime()->mktime():974943297
settimeofday(设置目前时间)
相关函数
time,ctime,ftime,gettimeofday
表头文件
#i nclude
#i nclude
定义函数
int settimeofday ( const struct timeval tv,const struct timezone tz);
函数说明
settimeofday()会把目前时间设成由tv所指的结构信息,当地时区信息则设成tz所指的结构。详细的说明请参考gettimeofday()。注意,只有root权限才能使用此函数修改时间。
返回值
成功则返回0,失败返回-1,错误代码存于errno。
错误代码
EPERM 并非由root权限调用settimeofday(),权限不够。
EINVAL 时区或某个数据是不正确的,无法正确设置时间。
ctime 主要是将一个time_t的变量格式化输出成标准时间的格式
比如 time_t a=time(NULL);
这时候a 的值为一个long数,是从标准时间到当前时间的秒数
而 char pt=ctime(&a);这时候你输出字符串pt,就是现在的标准时间,年月日时分秒
#include <iostream>
#include <windowsh>
using namespace std;
void main()
{
SYSTEMTIME time;//时间结构声明,这个结构是系统的,
GetSystemTime( &time ); //调用获取系统时间api
//GetLocalTime();这个函数是获取本地时间api
char t_y;
char t_m;
char t_h;
char t_Min;
char t_s;
char t_Mi;
char t_d;
char t_w;
SYSTEMTIME time;//时间结构声明,这个结构是系统的,
GetSystemTime( &time );//调用获取系统时间api
sprintf(t_y, "%d", timewYear);//将年份格式输出到t_y变量中
sprintf(t_m, "%d", timewMonth);
sprintf(t_w, "%d", timewDayOfWeek);
sprintf(t_d, "%d", timewDay);
sprintf(t_h, "%d", timewHour);
sprintf(t_Min, "%d", timewMinute);
sprintf(t_s, "%d", timewSecond);
sprintf(t_Mi, "%d", timewMilliseconds);
printf("%s,%s,%s,%s,%s,%s,%s,%s",
timewYear,
timewMonth,
timewDayOfWeek,
timewDay,
timewHour,
timewMinute,
timewSecond,
timewMilliseconds);
}
/
SYSTEM结构成员如下:
SYSTEMTIME STRUCT
{
WORD wYear ; 年
WORD wMonth ;月
WORD wDayOfWeek ;星期,0=星期日,1=星期一
WORD wDay ;日
WORD wHour ;时
WORD wMinute ;分
WORD wSecond ;秒
WORD wMilliseconds ;毫秒
}SYSTEMTIME ENDS
///
#ifndef CTIME_H
#define CTIME_H
#include<fstream>
#include<iostream>
class CTime{
public:
CTime():hour(0),minute(0),second(0){}
CTime(int h,int m,int s):hour(h),minute(m),second(s){}
CTime(int m,int s):hour(0),minute(m),second(s){}
CTime(int h):hour(h),minute(0),second(0){}
void ResetTime(int h=0,int m=0,int s=0)
{hour=h;minute=m;second=s;}
friend void ShowTime(string str);
private:
int hour;
int minute;
int second;
std::string s;
};
using namespace std;
void ShowTime(string str)
{
cout<<"显示时间:"<<ends;
cout<<hour<<":"<<minute<<":"<<second<<ends;
s=str;
ofstream of;
ofopen(sc_str(),ofstream::app);
of<<hour<<":"<<minute<<":"<<second<<ends;
ofclose();
}
#endif
//通过ctime来获取系统当前时间
#include<iostream>
#include<ctime>
using namespace std;
int main()
{
//time_t精确到秒,是当前时间和1900年1月1日零点时间的差
const time_t t=time(NULL);
struct tm systemtime=localtime(&t);
cout<<"year="<<1900+systemtime->tm_year<<endl;//和1900年1月1日零点时间的差
cout<<"month="<<1+systemtime->tm_mon<<endl;//月数0-11(大坑比)
cout<<"day="<<systemtime->tm_mday<<endl;
cout<<"hour="<<systemtime->tm_hour<<endl;
cout<<"minute="<<systemtime->tm_min<<endl;
cout<<"second="<<systemtime->tm_sec<<endl;
}
注意要加上tm_,如tm_min
那个struct(结构体)是ctime自带的,变量名随意
以及用C++的,为什么不用高级一点的ctime呢?
1 ctime函数
函数: ctime
功 能: 把日期和时间转换为字符串
用 法: char ctime(const time_t time);
程序例:
#include<cstdio>
#include<ctime>
intmain(void)
{
time_tt;
t=time(&t);
printf("Today'sdateandtime:%s\n",ctime(&t));
return0;
}
注:若在linux下使用本函数,需要include <timeh>头文件
2CTime类
CTime类的对象表示的时间是基于格林威治标准时间(GMT)的。CTimeSpan类的对象表示的是时间间隔。
CTime类一般不会被继承使用。其对象的大小是8个字节。
CTime表示的日期上限是2038年1月18日,下限是1970年1月1日 12:00:00 AM GMT。
CTime类的成员函数
CTime();
构造一个未经初始化的CTime对象。此构造函数使我们可以定义一个CTime对象的数组,在使用数组前需要以有效的时间值为其初始化。
CTime(__time64_t time);
以一个__time64_t(注意:最前面的下划线有两条)类型的数据来构造一个CTime对象。参数time是一个__time64_t类型的值,表示自GMT时间1970年1月1日零点以来的秒数,这里要注意的是,参数time代表的时间会转换为本地时间保存到构造的CTime对象中。例如,我们传递参数0构造一个CTime对象,然后调用CTime对象的GetHour成员函数将返回8,因为参数0代表的GMT时间转换为北京时间后为1970年1月1日 8:00:00。
CTime(
int nYear,
int nMonth,
int nDay,
int nHour,
int nMin,
int nSec,
int nDST = -1
);
以本地时间的年、月、日、小时、分钟、秒等几个时间分量构造CTime对象。参数nYear、nMonth、nDay、nHour、nMin、nSec分别表示年、月、日、小时、分钟、秒,取值范围如下:
时间分量 取值范围
nYear 1970-3000
nMonth 1-12
nDay 1-31
nHour 0-23
nMin 0-59
nSec 0-59
参数nDST指定是否实行夏令时,为0时表示实行标准时间,为正数时表示实行夏令时,为负数时由系统自动计算实行的是标准时间还是夏令时。
CTime(const SYSTEMTIME& st,int nDST = - 1) ;
以一个SYSTEMTIME结构体变量来构造CTime对象。SYSTEMTIME结构体也是我们对日期时间的常用表示方式。参数st为以本地时间表示的SYSTEMTIME对象,参数nDST同上。
static CTime WINAPI GetCurrentTime( );
获取系统当前日期和时间。返回表示当前日期和时间的CTime对象。
int GetYear( ) const;
获取CTime对象表示时间的年份。范围从1970年1月1日到2038年(包括2038年)1月18日。
int GetMonth( ) const;
获取CTime对象表示时间的月份。范围为1到12。
int GetDay( ) const;
获取CTime对象表示时间的日期。范围为1到31。
int GetHour( ) const;
获取CTime对象表示时间的小时。范围为0到23。
int GetMinute( ) const;
获取CTime对象表示时间的分钟。范围为0到59。
int GetSecond( ) const;
获取CTime对象表示时间的秒。范围为0到59。
int GetDayOfWeek( ) const;
此函数的返回值表示CTime对象代表的是星期几,1表示是周日,2表示是周一,以此类推。
CString Format(LPCTSTR pszFormat) const;
将CTime对象中的时间信息格式化为字符串。参数pszFormat是格式化字符串,与printf中的格式化字符串类似,格式化字符串中带有%前缀的格式码将会被相应的CTime时间分量代替,而其他字符会原封不动的拷贝到返回字符串中。格式码及含义如下:
%a:周的英文缩写形式。
%A:周的英文全名形式。
%b: 月的英文缩写形式。
%B:月的英文全名形式。
%c: 完整的日期和时间。
%d:十进制形式的日期(01-31)。
%H:24小时制的小时(00-23)。
%I: 12小时制的小时(00-11)。
%j: 十进制表示的一年中的第几天(001-366)。
%m: 月的十进制表示(01-12)。
%M:十进制表示的分钟(00-59)。
%p: 12小时制的上下午标示(AM/PM)。
%S: 十进制表示的秒(00-59)。
%U: 一年中的第几个星期(00-51),星期日是一周的第一天。
%W: 一年中的第几个星期(00-51),星期一是一周的第一天。
%w: 十进制表示的星期几(0-6)。
%Y: 十进制表示的年。
CTime operator +(CTimeSpan timeSpan) const;
将CTime对象和CTimeSpan对象相加,返回一个CTime对象。实际意义就是在一个时间的基础上推后一个时间间隔,得到一个新的时间。
CTime operator -(CTimeSpan timeSpan) const;
将CTime对象和一个CTimeSpan相减,返回一个CTime对象。实际意义就是在一个时间的基础上提前一个时间间隔,得到一个新的时间。
CTimeSpan operator -(CTime time) const;
将该CTime对象和另一个CTime对象相减,返回一个CTimeSpan对象。实际意义就是计算两个时间点的间隔,得到一个CTimeSpan对象。
CTime& operator +=(CTimeSpan span);
为该CTime对象增加一个span表示的时间间隔。
CTime& operator -=(CTimeSpan span);
为该CTime对象减去一个span表示的时间间隔。
CTime& operator =(__time64_t time);
为该CTime对象赋予一个新的时间值。
简单说下剩下的几个重载i运算符:
operator == : 比较两个绝对时间是否相等。
operator != : 比较两个绝对时间是否不相等。
operator > : 比较两个绝对时间,是否前一个大于后一个。
operator < : 比较两个绝对时间,是否前一个小于后一个。
operator >= : 比较两个绝对时间,是否前一个大于等于后一个。
operator <= : 比较两个绝对时间,是否前一个小于等于后一个。[1]
=====================================================================
C++中,CTime 与 CString转换
CTime m_StartTime1 = CTime::GetCurrentTime();
CString csStartTime = m_StartTime1Format( "%Y%m%d%H%M%S" );
一将CString转为CTime的几种方法
CString timestr = "2000年04月05日";
int a,b,c ;
sscanf(timestrGetBuffer(timestrGetLength()),"%d年%d月%d日",&a,&b,&c);
CTime time(a,b,c,0,0,0);
--------or - ---------------------
CString s("2001-8-29 19:06:23");
int nYear, nMonth, nDate, nHour, nMin, nSec;
sscanf(s, "%d-%d-%d %d:%d:%d", &nYear, &nMonth, &nDate, &nHour, &nMin, &nSec);
CTime t(nYear, nMonth, nDate, nHour, nMin, nSec);
---- or ------------------------
CString timestr = "2000年04月05日";
int year,month,day;
BYTE tt[5];
//get year
memset(tt, 0, sizeof(tt));
tt[0] = timestr[0];
tt[1] = timestr[1];
tt[2] = timestr[2];
tt[3] = timestr[3];
year= atoi((char )tt);
//get month
memset(tt, 0, sizeof(tt));
tt[0] = timestr[6];
tt[1] = timestr[7];
month = atoi((char )tt);
//get day
memset(tt, 0, sizeof(tt));
tt[0] = timestr[10];
tt[1] = timestr[11];
day = atoi((char )tt);
CTime time(year,month,day,0,0,0);
从上面来看,很明显使用sscanf()函数的优势
二将CTIme转换为CString的方法:
CTime tmSCan = CTime::GetCurrentTime();
CString szTime = tmScanFormat("'%Y-%m-%d %H:%M:%S'");
这样得到的日期时间字符串就是以"2006-11-27 23:30:59"的格式这是不是很方便呢
//取得CTime中的日期
CString cstrDate = tmScanFormat("%Y-%m-%d");
//取得CTime中的时间
CString cstrTime = tmScanFormat("%H:%M-%S");
sprintf还有个不错的表妹:strftime,专门用于格式化时间字符串的,用法跟她表哥很像,也是一大堆格式控制符,只是毕竟小姑娘家心细,她还要调用者指定缓冲区的最大长度,可能是为了在出现问题时可以推卸责任吧。这里举个例子:
更多更好的sprintf()函数说明参考:《spirntf,你知道多少?》
time_t t = time(0);
//产生"YYYY-MM-DD hh:mm:ss"格式的字符串。
char s[32];
strftime(s, sizeof(s), "%Y-%m-%d %H:%M:%S", localtime(&t));
sprintf在MFC中也能找到他的知音:CString::Format,strftime在MFC中自然也有她的同道:CTime::Format,这一对由于从面向对象哪里得到了赞助,用以写出的代码更觉优雅
在VC的MFC中可以使用
CTime time = CTime::GetCurrentTime(); ///构造CTime对象
CString m_strTime = timeFormat("%Y-%m-%d %H:%M:%S"); //将获得的时间以年-月-日 时:分:秒的形式保存到m_strTime 字符串变量中,如果你需要保存到文本中,就再加上文件 *** 作的函数就可以了。
CTime类有GetDay、GetHour等函数。
先用CTime time = CTime::GetCurrentTime()获取当前时间,再用timeGetDay()获得当前天数,并将这个天数保存起来(可以保存到文件、数据库或注册表中),10天后再运行程序,获取当前时间,再取以前保存的时间,前者减去后者,就是天数差了。
以上就是关于C语言中获取时间的方法是什么全部的内容,包括:C语言中获取时间的方法是什么、C++,函数ctime,有哪些功能、求C++获取系统时间源代码,精确到毫秒等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)