在C语言中如何处理时间和日期

2016-02-19 20:52 10 1 收藏

给自己一点时间接受自己,爱自己,趁着下午茶的时间来学习图老师推荐的在C语言中如何处理时间和日期,过去的都会过去,迎接崭新的开始,释放更美好的自己。

【 tulaoshi.com - 编程语言 】

ChUCk Allison 是盐湖城圣 Latter Day 教堂总部下耶稣教堂家族历史研究处的软件体系设计师。他拥有数学学士和数学硕士学位。他从1975年起开始编程,从1984年起他开始从事c语言的教学和开发。他目前的爱好是面向对象的技术及其教育。他是X3J16,ANSI C ++标准化委员会的一员。
  
  大部分的操作系统有办法得到当前的日期和时间。通过定义在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)

来源:https://www.tulaoshi.com/n/20160219/1624738.html

延伸阅读
自己总结的,觉得能帮助初学者看透一些纷繁复杂的语法规则,理解C语言的真谛 第一次发布,不一定正确,欢迎讨论、指正、补充 1. 表达式定律 !-- frame contents -- !-- /frame contents -- 任何能产生数值结果的运算、操作都可以作为表达式,并可以放到任何需要数值结果的地方,只要数值类型能...
作者在使用C语言编程实践过程中发现,尽管所编程序从语法上看正确的,能够调试通过,但实际执行结果却达不到程序编制的目的。现举几例说明如下,希望能起到帮助C语言初学者少走弯路的作用。 一.调用unlink失败的原因及解决方法 !-- frame contents -- !-- /frame contents -- unlink的原型在”io.h”中,...
在c++中,为了解决一些频繁调用的小涵数大量消耗栈空间或者是叫栈内存的问题,非凡的引入了inline修饰符,表示为内联涵数。 !-- frame contents -- !-- /frame contents -- 可能说到这里,很多人还不明白什么是栈空间,其实栈空间就是指放置程序的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,假如频...
  在面向对象的语言里面,出现了类的概念。这是编程思想的一种进化。所谓类:是对特定数据的特定操作的集合体。所以说类包含了两个范畴:数据和操作。而C语言中的strUCt仅仅是数据的集合。(liyuming1978@163.com) 1.实例:下面先从一个小例子看起 iframe src="http://www.pconline.com.cn/pcedu/emp...
1.图像平移 图像平移只是改变图像在屏幕上的位置,图像本身并不发生变化。 !-- frame contents -- !-- /frame contents -- 假设原图像区域左上角坐标为(x0, y0),右下角坐标为(x1, y1),将图像分别沿x和y轴平移dx和dy,则新图像的左上角坐标为(x0 +dx, y0+dy),右下角坐标为(x1+dx, y1+dy)。坐标平移变换公...

经验教程

12

收藏

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