C语言中对时间和日期的处理

2016-01-29 12:17 9 1 收藏

C语言中对时间和日期的处理,C语言中对时间和日期的处理

【 tulaoshi.com - C语言心得技巧 】

C语言中对时间和日期的处理


原著:Chuck Allison

翻译:孟谨

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)


原文出处:Code Capsules:Time and Date Processing in C

  Chuck Allison 是盐湖城圣 Latter Day 教堂总部下耶稣教堂家族历史研究处的软件体系设计师。他拥有数学学士和数学硕士学位。他从1975年起开始编程,从1984年起他开始从事c语言的教学和开发。他目前的兴趣是面向对象的技术及其教育。他是X3J16,ANSI C ++标准化委员会的一员。发送e-mail到 allison@decus.org,或者拨打电话到 (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列出了格式描述符的完整列表。

时间/日期运算

  通过改变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下,当

来源:http://www.tulaoshi.com/n/20160129/1485442.html

延伸阅读
女人喝茶有讲究 喝对时间更养生 多喝茶更能促进食物消化并提神醒脑,还有许多好处,但是茶不是每个时段都能喝,尤其是女人朋友更得特别留意,以免身体越喝越差!同时喝茶的时候还有许多禁忌,今天就让图老师小编带你全面了解喝茶需要注意的事项,这样喝茶才能喝得健康。 女人在什么时候不宜喝茶 大家都知道喝茶对身体好,尤其...
标签: 孕妇食谱
喝汤要对时间 这些汤晚上不要喝     为了减肥,有些朋友尤其是女性朋友选择晚上喝汤不吃饭的办法,以期达到减肥的效果。图老师的专家告诉想做减肥的朋友,有些烫的营养价值甚至比晚饭的营养还要高,注意不要适得其反,也有的汤晚上不适宜喝。专家建议晚餐应适当吃得清淡些,油水过多的靓汤很有可能会让...
相信很多人都看过设计模式方面的书,大家有什么体会呢?Bridge,Proxy,Factory这些设计模式都是基于抽象类的。使用抽象对象是这里的一个核心。        !-- frame contents -- !-- /frame contents -- 其实我觉得框架化编程的一个核心问题是抽象,用抽象的对象构建程序的主体框架,这...
一、sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 二、sizeof的使用方法 1、用于数据类型 sizeof使用形式:sizeof(type) 数据类型...
标签: 育儿知识
超实用满月宝宝护理方法 下面介绍宝宝第一个月的五个方面20个护理要点,相信妈妈们看完一定会有很大的帮助。 许多新手妈妈面对宝宝的诞生,既激动又不知所措,因为宝宝的降临让生活变得更幸福更甜蜜而感到激动;但面对娇弱的小生命,不知该如何护理而感到不知所措。 一、满月之后宝宝怎么睡 对于宝宝来说,睡眠是至关重...

经验教程

844

收藏

67
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部