在C语言中如何处理时间和日期
2008-02-23 05:26:17来源:互联网 阅读 ()
大部分的操作系统有办法得到当前的日期和时间。通过定义在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列出了格式描述符的完整列表。
时间/日期运算
通过改变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
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)
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: C程式设计语言概论
下一篇: C语言初学者的十八颗“地雷”
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash