- 浏览: 444648 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
zjhgx:
多谢,多谢。多谢
Ubuntu 中软件的安装、卸载以及查看的方法总结 -
37du:
受教了,对于理解运行过程有很好的效果
ActionMapper---webwork 2.1到2.2 的变化 -
chxiaowu:
非常好,谢谢!
Ubuntu 中软件的安装、卸载以及查看的方法总结 -
euii:
谢谢,这样的总结。
Ubuntu 中软件的安装、卸载以及查看的方法总结 -
xiaoyao3857:
谢谢,正需要这样的汇总型字典!
Ubuntu 中软件的安装、卸载以及查看的方法总结
时间与日期
通常对于 一个程序来说可以确定时间与日期是十分用的。也许他要记录其运行的时间,或者是他要一个特定的时间改变其形为。例如,一个游戏程序也许不会在工作时间运 行,或者是一个备份调度会在启动自动备份之前等待早些的工作完成。
所有的Unix 系统对于时间与日期都使用相同的起始点:1970年1月1日午午夜GMT。这是Unix的创世纪,而Linux也不例外。而在Linux系统中所有的时间 都是以秒记量的。这与MS-DOS处理时间的方式相似,所不同是MS-DOS是由1980年开始的。其他的系统使用其他的记时起始时间。
时间是使用一个定义的time_t类型来处理。这是一个足够大的整数类型来包含以秒计的日期与时间 值。在Linux系统上,他是一个长整数,其定义以及相关的操作函数都定义在头文件time.h中。
不要认为时间是32位的。在Unix以及Linux系统上使用一个32位的time_t类型,而这 个时间会在2038年重叠。到那时,我们希望这些系统都使用一个大于32位的time_t类型。
#include <time.h>
time_t time(time_t *tloc);
我们可以调用time函数来得到一个底层 的时间值,这个函数会返回由纪元起点开始的秒数。如果tloc不为空指针,函数就会将返回值写入tloc所指的变量中。
试验--时间
这里是一个简 单的时间程序,envtime.c,来演示time函数:
#include <time.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
int i;
time_t the_time;
for(i = 1; i <= 10; i++) {
the_time = time((time_t *)0);
printf(“The time is %ld\n”, the_time);
sleep(2);
}
exit(0);
}
当我们运行这个程序时,他会每隔2秒打印出底层时间值。
$ ./envtime
The time is 1044695820
The time is 1044695822
The time is 1044695824
The time is 1044695826
The time is 1044695828
The time is 1044695830
The time is 1044695832
The time is 1044695834
The time is 1044695836
The time is 1044695838
工作原量
这个程序使用一个 空指针参数来调用time函数,这个函数会返回以秒计的时间与日期值。程序会休眠2秒,并且重复调用time函数10次。
使用由1970年开始的以秒计的时间与日期值对于估量某件事持续多少时间是十分有用的。我们只需要 简单的使用两个由time调用得到的时间进行减法操作即可。然而结过仔细的考虑,ISO/ANSIC C标准委员会并没有说时time_t类型要用于计量以秒计的时间间隔值,所以他们开发了一个函数,difftime,这个函数会计算两个time_t值之 间的间隔,并且返回一个double类型:
#include <time.h>
double difftime(time_t time1, time_t time2);
difftime函数计算两个时间值 之间的间隔,并且返回time1-time2的浮点值。对于Linux系统而言,由time返回的值是秒数,并且可以进行操作,但是为了移植考虑,我们应 使用difftime函数。
为了以更为有意义的方式来表示时间与日期,我们需要将 时间值转换为可以识别的时间与日期。这有标准的函数可以帮助我们做到。
gmtime 函数将底层的时间值分隔并且存放到包含更为通用域的一个结构中:
#include <time.h>
struct tm *gmtime(const time_t timeval);
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(一月为0)
int tm_year 由1900年起的年数
int tm_wday 一星期中的天,0-6(星期日为0)
int tm_yday 一年中的天,0-365
int tm_isdst 有效的白天数
试验--gmtime
这里 有一个程序,gmtime.c,使用tm结构与gmtime函数打印当前时间与日期:
#include <time.h>
#include <stdio.h>
int main()
{
struct tm *tm_ptr;
time_t the_time;
(void) time(&the_time);
tm_ptr = gmtime(&the_time);
printf(“Raw time is %ld\n”, the_time);
printf(“gmtime gives:\n”);
printf(“date: %02d/%02d/%02d\n”,
tm_ptr->tm_year, tm_ptr->tm_mon+1, tm_ptr->tm_mday);
printf(“time: %02d:%02d:%02d\n”,
tm_ptr->tm_hour, tm_ptr->tm_min, tm_ptr->tm_sec);
exit(0);
}
当我们运行这个程序时,我们会得到更可读的时间与日期值:
$ ./gmtime; date
Raw time is 1044696004
gmtime gives:
date: 103/02/08
time: 09:20:04
Sat Feb 8 09:20:04 GMT 2003
工作原理
这个程序调用 time函数得到一个底层的时间值,然后调用gmtime将其转换为一个具有时间与日期值的结构。程序会使用printf函数打印输出。严格来讲,我们不 应使用这种方式打印原始时间,因为并不能保证在所有的系统他都是一个long类型。在gmtime函数之后,我们立即运行date命令来比较其输出。
然而,在这里我们一个小问题。如果我们在一个不使用格林尼治时间的时区运行这个程序,或者 是我们本地的白天存储时间是有效的(问题?),我们就会注意到这个时间并不正确。这是因为gmtime是使用GMT返回时间。Linux与Unix系统这 样做,从而世界上的程序与系统都是同步的。不同时区在同一时间创建的文件会显示出具有相同的创建时间。要查看本地时间,我们需要使用localtime函 数来代替。
#include <time.h>
struct tm *localtime(const time_t *timeval);
localtime函数与gmtime相同,所不同的是他会返回一个包含为本地时区进行过 调整后的结构。如果我们再次试验gmtime程序,但是使用localtime函数来替换gmtime,我们就会看到一个正确的时间与日期报告。
要将一个打乱的tm结构转换为一个原始的time_t值,我们可以使用mktime函数:
#include <time.h>
time_t mktime(struct tm *timeptr);
如果结构不可以表示为一个time_t值,mktime函数会返回-1。
与date程序所提供的时间与日期等机器值相反,为了友好,我们可以使用asctime与 ctime函数:
#include <time.h>
char *asctime(const struct tm *timeptr);
char *ctime(const time_t *timeval);
asctime函数返回一个代表tm结构timeptr给出的时间与日期的字符串。返回的字符串的 格式如下:
Sun Jun 6 12:30:34 1999\n\0
他总是26个字符长的固定格式。函数ctime与下面的函数调用等同:
asctime(localtime(timeval))
他使用一个原始时间值作为参数,并将其转换为一个更可读的本地时间。
试验--ctime
让我们 使用下面的代码来实际的看一下ctime:
#include <time.h>
#include <stdio.h>
int main()
{
time_t timeval;
(void)time(&timeval);
printf(“The date is: %s”, ctime(&timeval));
exit(0);
}
将其保存为 ctim.c,编译运行,我们应可以看到下面的输出:
$ ./ctime
The date is: Sat Feb 8 09:21:17 2003
工作原理
ctime.c 程序调用time函数来得到一个底层的时间值,然后让ctime来完成所有的困难工作,将其转换为一个可读的字符串并打印输出。
为了可以对实际的时间与日期字符串进行更多的控制,Linux与现代的类Unix系统提供了 strftime函数。这与用在日期与时间上的sprintf函数相类似,且其工作方式也相似:
#include <time.h>
size_t strftime(char *s, size_t maxsize, const char *format, struct tm *timeptr);
strftime 函数会格式化由timeptr指向的tm结构表示的时间与日期,并将其结构放在字符串s中。字符串被指明至少maxsize字符长。format字符串用 来控制写入字符串的字符。与printf相似,他包含要传递到字符串的通常字符与格式化时间与日期元素的转义说明。转义说明包括:
转义符 描述
%a 简写的星期名
%A 全写的星期名
%b 简写的月名
%B 全写的月名
%c 日期与时间
%d 一月中的天,01-31
%H 时,00-23
%I 12小时时钟表示的小时,01-12
%j 一年中的天,001-366
%m 一年中的月,01-12
%M 分,00-59
%P a.m或p.m
%S 秒,00-61
%u 星期中的天,1-7(星期1为1)
%U 一年中的星期,01-53(星期日为一个星期的第一天)
%V 一年中的星期,01-53(星期一为一个星期的第一天)
%w 一个星期中的天,0-6(星期日为0)
%x 本地格式日期
%X 本地格式时间
%y 小于1900的年号
%Y 年
%Z 时区名字
%% A%字符
所以,由date程序所指定的通常日期对应于strftime中的格式化字符串为
“%a %b %d %H:%M:%S %Y”
为了有助于读取日期, 我们可以使用strptime函数,这个函数会将一个表示日期与时间的字符串作为参数,并且创建一个表示同样日期与时间tm结构:
#include <time.h>
char *strptime(const char *buf, const char *format, struct tm *timeptr);
format 字符串的组成与strftime的格式化字符串完全相同。strptime的动作形为与sscanf相似,因为他们都搜索字符串,查找标识的域,然后将他 们写入变量。在这里的变量为依据格式化字符串要填充的tm结构的成员。然而,与strftime的转义字符比起来,strptime的转义字符是不严密 的,因为strptime会在天与月上允许简写与全名两种形式。每一个表示都会匹配strptime中的一个%a说明符。strftime总是在小于10 的数字上添加0,而strptime会将其看作可选的。
strptime会返回 一个指向转换操作中最后一个处理字符之后的字符的指针。如果遇到不可以转换的字符,转换操作就简单的在那里停止。调用程序需要检测以确保所传递的字符都是 可以写入tm结构的有意义的字符。
试验--strftime与strptime
下面我们看一下下面的程序中所使用的转义字符:
#include <time.h>
#include <stdio.h>
int main()
{
struct tm *tm_ptr, timestruct;
time_t the_time;
char buf[256];
char *result;
(void) time(&the_time);
tm_ptr = localtime(&the_time);
strftime(buf, 256, “%A %d %B, %I:%S %p”, tm_ptr);
printf(“strftime gives: %s\n”, buf);
strcpy(buf,”Sat 26 July 2003, 17:53 will do fine”);
printf(“calling strptime with: %s\n”, buf);
tm_ptr = ×truct;
result = strptime(buf,”%a %d %b %Y, %R”, tm_ptr);
printf(“strptime consumed up to: %s\n”, result);
printf(“strptime gives:\n”);
printf(“date: %02d/%02d/%02d\n”,
tm_ptr->tm_year % 100, tm_ptr->tm_mon+1, tm_ptr->tm_mday);
printf(“time: %02d:%02d\n”,
tm_ptr->tm_hour, tm_ptr->tm_min);
exit(0);
}
当我们运行这个程序strftime.c时,我们会得到下面的输出:
$ ./strftime
strftime gives: Sunday 06 June, 11:55 AM
calling strptime with: Sat 26 July 2003, 17:53 will do fine
strptime consumed up to: will do fine
strptime gives:
date: 03/07/26
time: 17:53
工作原理
strftime 程序通过调用time与localtime函数得到当前的本地时间。然后他通过使用一个合适的格式化字符串作为参数来调用strftime将其转换为可读 的格式。为了演示strptime的用法,程序设置了一个包含日期与时间的字符串,然后调用strptime来得到原始的时间与日期值,并且打印输出。转 义字符%R是strptime中%H:%M的简写形式。
在这里要注意的一点就是, 为了可以成功的搜索一个日期,strptime函数需要一个精确的格式化字符串。通常,他并不会精确的搜索由用户读取的时间,除非这个格式是非常严格的。
也许当我们编译strftime.c时,编译器会提出警告。这是因为GNU库默认并没有声 明strftime。这个问题的修正方法就是通过在包含time.h之前添加下面的行来显示的请求X/Open标准特征:
#define _XOPEN_SOURCE
Quote : http://blog.csdn.net/zkx1982/archive/2007/12/21/1957021.aspx
发表评论
-
htonl(),htons(),ntohl(),ntons()--大小端模式转换函数
2010-12-16 16:51 4050不同机器内部对变量的字节存储顺序不同,有的采用大端模式(big ... -
关于Linux静态库和动态库的分析
2010-09-28 10:29 16131.什么是库在windows平台和linux平台下都大量存在着 ... -
Heartbeat
2010-09-01 19:31 1379Heartbeat 项目是 Linux-HA ... -
linux下更改共享内存的最大值
2010-07-26 13:22 6029System V IPC 参数 名字 ... -
环境变量相关
2010-06-10 15:03 978系统环境变量: /etc/profile:此文件 ... -
linux中的信号处理(signal与alarm)
2010-05-12 15:25 1769简单处理程序: ... -
IPC之消息队列
2010-03-13 12:05 1408消息队列缺点: 1. 如果进程创建了一个消息队列,在该队 ... -
如何让errno多线程/进程安全
2010-03-13 11:35 1754在 linux 或者 unix 环境中, errno ... -
Linux下库相关的概略介绍及动态库的搜索路径优先级
2010-03-13 11:29 1623(本文主要针对动态连接 ... -
ftok函数
2010-03-13 11:01 1745系统建立IPC通讯(如消 ... -
About pci.ids
2009-12-23 21:01 1725pci.ids - This is a public r ... -
port I/O
2009-12-21 15:27 1153Name outb, outw, outl, outsb ... -
udev相关
2009-12-11 20:22 1164udev 是Linux kernel 2.6系 ... -
SMP(Symmetrical Multi-Processing)
2009-12-11 15:22 1731对称多处理" ... -
功能强大的sed命令
2009-11-27 21:55 2003vim不太熟练,发现shell的sed命令很强大。 1. S ... -
/etc/sudoers配置文件的格式
2009-11-25 20:56 1612-------下面文章转载自网 ... -
/etc/sudoers中的含义
2009-11-25 20:55 2483Sudo 是允许系统管理员让普通用户执行一些或者全部的roo ... -
linux下如何模拟按键输入和模拟鼠标
2009-11-14 10:06 2813查看/dev/input/eventX是什么类型的事件, ca ... -
Linux root file system
2009-11-05 20:03 10561. Linux for PowerPC Embedded S ... -
Linux下库相关的概略介绍及动态库的搜索路径优先级
2009-10-31 18:24 2082(本文主要针对动态连接库,内容来源网络,重新整理之,高亮部分的 ...
相关推荐
linux qt4下 时间 日期的刷新显示方法
对linux的日期时间问题进行了比较系统的总结
linux下时间和日期操作的课件,难得的资源
本资源为《Linux系统函数调用日期时间》。主要包含linux系统下的一些关于时间和日期的函数的用法和返回值。
Linux 指令篇日期时间排程 基础资料,适合需要学习日期方面的同学。
linux c++ 时间判断
利用Java代码设置Linux系统时间。设置时间精确到毫秒级别。
linux赋予普通用户修改系统时间权限linux赋予普通用户修改系统时间权限
取aix、linux上一个月的日期shell脚本;
在linux下,我们可以通过自带的NTP(Network Time Protocol)协议通过网络使自己的系统保持精确的时间。 NTP是用来使系统和一个精确的时间源保持时间同步的协议。建议大家在自己管理的网络中建立至少一台时间服务器来...
ind 按文件修改时间查找文件 ---(+n)----------|----------(n)----------|----------(-n)--- (n+1)*24H前| (n+1)*24H~n*24H间 |n*24H内 -ctime -n 查找距现在 n*24H 内修改过的文件 -ctime n 查找距现在 n*24H 前...
标准库函数除了定义一些处理日期和时间的函数外,还定义了处理与程序有关的地理信息的函数。对这些函数讨论如下。 时间和日期函数需要头部。这个头部定义了三种与时间有关的类型:clock_t,time_t蛅m。类型clock_t...
有时候可能需要检查有关文件的详细信息,例如文件的修改日期。当你要检查文件的最后编辑时间时,本文可能会派上用场。在本文将学习4种方法查看文件的修改日期。
LINUX按时间批量删除文件(删除N天前文件)
8、Linux指令之文件目录、时间日期、搜索查找、压缩和解压 9、Linux组管理和权限管理 10、Linux任务调度 11、Linux磁盘操作 12、Linux进程管理 13、Linux RPM 包和YUm包 14、Linux上安装JDK、Tomcat、Eclipse...
linux命令行工具:删除指定目录下指定时间前的某些文件。 可以将包含delbefday的脚本加入crontab中自动定时删除指定目录下指定时间前的某些文件。 含源代码。
今天小编就为大家分享一篇linux 获取某个日期对应的月末日期方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
linux date
cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。 cron的配置文件称为“crontab”,是“cron table”的简写。 cron是一个linux下 的定时执行工具,可以在无需人工干预的情况下运行作业。 ...
Linux登录日志时间戳转换工具,主要用于Linux系统登录分析,方便溯源。