2025年4月7日 星期一 乙巳(蛇)年 正月初八 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > C语言

C语言中,怎样把时间存储到单个数字中?有这方面的标准吗?

时间:12-28来源:作者:点击数:102

把时间存储到单个数字中与把日期存储到单个数字中是类似的,因此,你可以先阅读一下13.1。另一方面,这两者之间也有差别。

首先,你应该注意到,一天中的时间比一年中的日期有更强的“确定性”。你知道一分钟内有多少秒,一小时内有多少分,一天内有多少小时。这种确定性使时间处理起来更容易,而且不容易出错。

在选择把时间转换为数字的方法时,你最好遵循下面这些原则:

  1. 应该尽可能地节约存储空间;
  2. 应该能存储不同种类的时间(标准的,军用的);
  3. 应该使时间使用起来又快又高效。

如果你已经阅读了13.1,你可能会认为处理这个问题的一个好办法就是用位域来表示时间。这确实是一个不错的办法,有其巧妙之处。请看下面这个把时间表示为一个整数的程序:

  • /*
  • * The bit field structures for representing time
  • */
  • typedef struct
  • {
  • unsigned int Hour : 5;
  • unsigned int Minute :6;
  • } TimeType;
  • typedef union
  • {
  • TimeType time;
  • int Number;
  • } TimeConverter;
  • /*
  • * Convert time to a number, returning zero when the values are
  • * out of range.
  • */
  • int TimeToNumber( int Hour, int Minute)
  • {
  • TimeConverter convert;
  • if (Hour<l || Hour>24 || Minute< 1 || Minute>60)
  • return 0;
  • convert, time. Hour = Hour;
  • convert, time. Minute = Minute;
  • return convert. Number+ 1;
  • }
  • /*
  • * Convert a number back into the two time
  • * elements that compose it.
  • */
  • void NumberToTime( int Number, int *Hour, int * Minute)
  • {
  • TimeConverter convert;
  • convert. Number = Number - 1;
  • * Hour = convert. time. Hour;
  • * Minute = convert. time. Minute;
  • }
  • /*
  • * A main routine that tests everything to
  • * ensure its proper functioning.
  • */
  • main()
  • {
  • int Number, Hour, Minute;
  • Hour=13;
  • Minute = 13;
  • Number = TimeToNumber( Hour, Minute);
  • NumberToTime( Number, &Hour, &Minute) ;
  • printf( "The time after conversion is %d:%d. \n" , Hour, Minute);
  • }

在时间表示中加入秒是很容易的,你只需在TimeType结构中加入一个秒域,并在每个转换函数中多加一个参数。

但是,假设你想把转换所得的数字用作时钟,让它整天“滴答滴答”地走个不停,你应该怎样做呢?如果用位域来完成这项任务,你就先需要把数字转换为位域,然后增加秒值,并检测秒值是否达到了60;如果秒值达到了60,你还需要增加分值,并再次检测分值是否达到了60……。这个过程太繁琐了!

这里的问题是:TimeType结构中的各个成员并不是刚好能纳入一个位域——它们的上限临界值并不是2的幂。因此,用数学的方法表示时间更好。这做起来相当简单,你可以用从当天开始时到当天某一点为止所度过的秒(或分)数来表示该点的时间。如果你用这种方法表示时间,那么在相应的数字上加1就相当于在时间上加1秒(或分)。下面的程序就是用这种方法表示时间的:

  • # include <stdio. h>
  • # include <stdlib. h>
  • /*
  • * A subroutine to convert hours and minutes into an
  • * integer number. This does not checking for the sake
  • * of brevity (you've seen it done before!).
  • */
  • int TimeToNumber(int Hours, int Minutes)
  • {
  • return Minutes+ Hours * 60;
  • }
  • /*
  • * Convert an integer to hours and minutes.
  • */
  • void NumberToTimeC int Number, int * Hours, int * Minutes)
  • {
  • * Minutes = Number % 60;
  • * Hours = Number / 60;
  • }
  • /*
  • * A quickie way to show time.
  • */
  • void ShowTime(int Number)
  • {
  • int Hours, Minutes;
  • NumberToTimeC Number, &Hours, &Minutes);
  • printf("%02d:%02d\n", Hours, Minutes);
  • }
  • /*
  • * A main loop to test the salient features of the time class.
  • */
  • main()
  • {
  • int Number, a;
  • Number = TimeToNumber(9,32);
  • printf("Time starts at :%d" , Number);
  • ShowTime(Number);
  • /*
  • * Assure yourself that minutes are added correctly.
  • * /
  • for( a = 0; a<10; + +a)
  • {
  • printf( "After 32 minutes :");
  • Number + = 32; / * Add 32 minutes to the time. * /
  • ShowTime(Number);
  • }
  • }

这个程序提供了一种更好的表示时间的方法。它容易操作,并且更为紧凑。它的代码还可以进一步压缩,加入秒的表示留给读者作为练习。

这种格式类似于C函数timelocal()和timegm()所使用的格式,这些函数都可以从任意给定的时间/日期开始计算秒数。只要对本章所提供的时间和日期处理程序稍作修改,你就可以使用这些程序了,而且还可以使用你自己定义的时间格式。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门