对于时间, C 阐述了这样几种概念:
1. Clock Tick: CPU时钟计时单元
2. Calender Time: 日历时间
3. Broken-down Time: 分解时间
4. Local Time: 本地时间
5. Coordinate Universal Time: 协调世界时
我试用了前两种计时方法:它们得到的结果都是以s为单位。无法精确到ms。后发现原来是因为它们得到的时间
都是整数型。相除后就是只取整了。例如下面的第一种方法:
clock_t clock_tick=clock();
double seconds = clock_tick/CLOCKS_PER_SECOND;
如果得到clock_tick=160
得到的seconds=0
而我需要的是精确值,其实就是进行下强制类型转换的。
即将上面的第二句代码重新写为:
double seconds = (double)clock_tick/(double)CLOCKS_PER_SECOND;
这样就可以得到精确值了。
2012.5.25
我又试了下我的omnet上面是要把CLOCKS_PER_SECOND写成CLOCKS_PER_SEC才可以正常使用
CLOCKS_PER_SECOND说是没有定义。
不知道其他的软件上是怎么样的。
前面三种可以理解为元数据类型, 分别对应于: clock_t, time_t, tm.
而后面两种只是前三种类型的地域性表示.
第一种, Clock Tick(CPU时钟计时单元)
它是一种时间计量单位, 可以和秒进行换算.
clock_t clock_tick = clock(); // 表示程序运行以来到执行完该语句所耗费
的CPU时钟计时单元个数
long seconds = clock_tick / CLOCKS_PER_SECOND; // 换算为秒
第二种, Calender Time(日历时间)
它表示的是某一时间点距离原始时间点的秒数, 即它是以秒为单位的时间间隔.
而这个原始时间点, 不同的系统表示不同, 一般为1970年1月1日0时0分0秒, 而
在.Net2005中为1899年12月30日0时0分0秒.
// 表示当前时间点距离原始时间点的秒数
time_t calender_time = time(NULL);
// 辅助函数
// double difftime(time_t time2, time_t time1)
// 计算二者的秒数之差
第三种, Broken-down Time(分解时间)
它表示的是结构体, 成员包括年月\日时\分秒(其他省略).
// 先得到当前的日历时间
time_t calender_time = time(NULL);
// 将日历时间转换为当前时区的分解时间
tm* local_time = localtime(&calender_time);
// 这里提到了当前时区的分解时间, 即本地时间. 因为日期时间
// 因时区的不同而各异,
// 例如: 北京位于东八区.
// 格林威治时间是统一的世界时间, 即上面提到的协调世界时间
// 这里将日历时间转换成格林威治式的分解时间
tm* utc_time = gmtime(&calender_time);
三种时间元类型给了我们很好的灵活性, 但也有值得注意的地方:
1. 可以直接获取当前的日历时间.
time_t calender_time = time(NULL);
2. 只能间接获取当前的分解时间, 借助localtime()函数进行转换
time_t calender_time = time(NULL);
tm* local_date = localtime(&calender_time);
3. 日历时间可以转化为日期的字符串表示
time_t calender_time;
// 赋值省略
char* szDate = ctime(calender_time);
4. 分解时间可以转化为日期的字符串表示
tm* date;
// 赋值省略
char* szDate = asctime(date);
5. 分解时间可以直接转换为日历时间
tm date;
// 赋值省略
time_t time = mktime(&date);
6. 日历时间可以转换为分解时间
time_t time;
// 赋值省略
tm* date = localtime(&time);
7. 分解时间可以格式化输出
// 借助strftime函数以及printf等函数