C语言中对时间和日期的处理惩罚
副标题#e#
本文具体先容C语言中对时间和日期的处理惩罚
Chuck Allison 是盐湖城圣 Latter Day 教堂总部下耶稣教堂家属汗青研究处的软件体系设计师。他拥有数学学士和数学硕士学位。他从1975年起开始编程,从1984年起他开始从事c语言的解说和开拓。他今朝的乐趣是面向工具的技能及其教诲。他是X3J16,ANSI C ++尺度化委员会的一员。发送e-mail到 [email protected],可能拨打电话到 (801)240-4510 均可以与他取得接洽。
大部门的操纵系统有步伐获得当前的日期和时间。通过界说在time.h的库函数,ANSI C能以很多差异的形式获得这个信息。函数time返回一个范例为time_t的值(凡是为long),该函数在运行期间对当前的日期和时间举办编码。然后你可以将这个返回值通报给其他能对该值举办解码和名目化的函数。
Listing 1 中的措施利用函数time,localtime和strftime以差异的形式输出当前的日期和时间。函数localtime把已经编码的时间解码成如下的struct:struct tm
{
int tm_sec; /* (0 - 61) */
int tm_min; /* (0 - 59) */
int tm_hour; /* (0 - 23) */
int tm_mday; /* (1 - 31) */
int tm_mon; /* (0 - 11) */
int tm_year; /* past 1900 */
int tm_wday; /* (0 - 6) */
int tm_yday; /* (0 - 365) */
int tm_isdst; /* daylight savings flag */
};
每次当你挪用localtime的时候,它会重写一个静态的布局并返回该布局的地点(因此同一时刻在一个措施中只能取得一个这样的布局,而不能做明明的拷贝)。函数ctime返回一个指向静态字符串的指针,该字符串以尺度的名目包括了完整的时间和日期。strftime按照用户的指命名目名目化字符串(譬喻,%A代表一周中每一天的名称)。Table 1列出了名目描写符的完整列表。
#p#副标题#e#
时间/日期运算
通过改变tm布局里的值,可对时间/日期举办运算。Listing 2 中的措施展示了如何计较未来某天的日期和以秒为单元所计较出的措施执行时间。留意函数time的语法(参数time_t由地点传入,并非作为函数的返回值)。函数mktime改变tm布局的值,以便日期和时间在一个符合的范畴内,之后day-of-week (tm_wday)和day-of-year (tm_yday)域举办相应的更新。mktime将tm布局中日期和时间的值置于符合的范畴之内,相应的更新day of week (tm-wday)和day of year (tm-yday)的值。这种环境产生在当一个日期超出了你的实现可以或许支持的范畴的时候。譬喻,我的MS-DOS的编译器不能编码1970年1月份之前的日期。函数asctime返回tm参数所描写时间的尺度字符串(因此ctime (&tval)与asctime (localtime(&tval)是相等的)。函数difftime返回用秒做单元的两个time_t的差。
假如需要处理惩罚超出系统范畴的日期,可能需要计较两个日期的隔断又不是用秒来做单元,那你需要设计本身的date编码。Listing 3 到 Listing 5 中的应用措施通过利用一个简朴的month-day-year布局,展示了确定两个日期隔断的年纪、月份数和天数的技能。日期的相减就像你在小学里做的减法那样(譬喻,首先举办天数的相减,假如需要就向月份数借位,以此类推)。留意跳过的年份都被计较进去了。为了大略起见,date_interval函数假设日期都是有效的,而且第一个日期在第二个日期之前。函数返回一个指向静态Date布局的指针,该布局包括了我们想要的谜底。
文件时间/日期戳
大大都操纵系统为文件维护时间/日期戳。至少你能得知一个文件最后被修改的时间。(常用的make东西利用这一信息来抉择一个文件是否需要被从头编译,可能一个应用措施是否需要被从头毗连)。由于文件系统在差异平台上有所差异,没有什么通用的函数获得一个文件的时间/日期戳,因此ANSI 尺度没有界说这样的函数。然而,大大都风行的操纵系统(包罗MS-DOS和VAX/VMS)提供了UNIX函数stat,该函数返回相关的文件信息,包罗用time_t暗示的最后修改时间。
Listing 6 中的措施利用stat和difftime来确定是否time1.c比time2.c更新(譬喻,是否最近被修悔改)。
假如你需要更新一个文件的时间/日期戳到当前时间,可简朴的重写文件的第一个字节。固然实际内容并未改变,但你的文件系统会认为文件已经被改变了,而且会相应的更新时间/日期戳。(知道你的文件系统!在VAX/VMS下,当你获得一个文件的新版本的时候,旧的版本仍会被保存)。这种技能叫做"”touching”一个文件"。Listing 7 中touch的实此刻指定文件不存在的时候会建设一个新文件。留意文件以"binary"模式打开(在打开模式字符串中由字符b抉择-在未来的专栏中我会具体接头文件处理惩罚的问题)。
表1:strftime的名目描写符
Code Sample Output
---------------------------------------------
%a Wed
%A Wednesday
%b Oct
%B October
%c Wed Oct 07 13:24:27 1992
%d 07 (day of month [01-31])
%H 13 (hour in [00-23])
%I 01 (hour in [01-12])
%j 281 (day of year [001-366])
%m 10 (month [01-12])
%M 24 (minute [00-59])
%p PM
%S 27 (second [00-59] )
%U 40 (Sunday week of year [00-52])
%w 3 (day of week [0-6])
%W 40 (Monday week of year [00-52])
%x Wed Oct 7, 1992
%X 13:24:27
%y 92
%Y 1992
%Z EDT (daylight savings indicator)
(完)