2006 年 09 月 16 日, 星期六

UNIX时间推导.按小时前后推导.按天前后推导.按月前后推导


在从其他机器采集日志文件时,我们常常会遇到采集前一小时,采集前一天,或者任务失败时候,从某一天的某个小时,一直到当前时间,每小时采集一次,等等诸如此类的需要推导一个或前或后时间。

在网上看了一部分同志只简单的实现了推导前一天,或后一天的脚本。
今天我把按时间推导,以小时为单位,或以天为单位,可自动往前推导N小时的日期或N天的日期,也可自动往后推导N小时的日期或N天的日期。由于使用循环推导,所以推导太大的数据,比如查询某个日期前99999小时的日期,循环就得做很多次,就会稍微有点慢了。
使用Oracle的时间函数进行测试,计算值与oracle数据库计算的结果一致,正确(仅在fedora core 5上测试)。
(我画了函数流程图,见http://bigboar.itpub.net/resource/8411/17830
编写的脚本:http://bigboar.itpub.net/resource/8411/17831
可以把脚本用函数的方法组织起来,我的是把脚本路径加入path,然后直接使用脚本 )
传说“http://bigboar.itpub.net/resource/8411/17831”的压缩解压有问题,放了没有压缩的文本,连接如下:

http://bigboar.itpub.net/resource/8411/17856
http://bigboar.itpub.net/resource/8411/17857
http://bigboar.itpub.net/resource/8411/17859
http://bigboar.itpub.net/resource/8411/17858



现把实现方法说明如下:


命令:date_deduce_hours
接受3个参数:
$1,输入一个以yyyy-mm-dd-hh24为格式的日期,如2006-09-15-08(注意,这个格式一定要符合给出的格式标准,否则出错)
$2,输入推导的小时数,若往$1以后的时间推导,则输入一个正整数(+正号要忽略),若往$1以前的时间推导,则输入一个负整数。
$3,固定参数为"format",可不输入,不输入时,命令返回的yyyy-mm-dd-hh24以实际数字为格式,如输入"format",则严格按照yyyy-mm-dd-hh24格式输出。
返回:
命令返回推导的日期结果

例:
1,求2006年3月12日20点前97个小时的对应日期,格式输出
[bigboar@bigboar deduce_date]$ date_deduce_hours 2006-03-12-20 -97 format
2006-03-08-19

2,求2006年3月12日20点前97个小时的对应日期,不格式输出(默认就是非格式输出)
[bigboar@bigboar deduce_date]$ date_deduce_hours 2006-03-12-20 -97
2006-3-8-19

3,求2006年3月12日20点后45个小时的对应日期,不格式输出(默认就是非格式输出)
[bigboar@bigboar deduce_date]$ date_deduce_hours 2006-03-12-20 45
2006-3-14-17

4,求2006年3月12日20点后45个小时的对应日期,格式输出
[bigboar@bigboar deduce_date]$ date_deduce_hours 2006-03-12-20 45 format
2006-03-14-17





命令:date_deduce_days
接受3个参数:
$1,输入一个以yyyy-mm-dd为格式的日期,如2006-09-15(注意,这个格式一定要符合给出的格式标准,否则出错)
$2,输入推导的天数,若往$1以后的时间推导,则输入一个正整数(+正号要忽略),若往$1以前的时间推导,则输入一个负整数。
$3,固定参数为"format",可不输入,不输入时,命令返回的yyyy-mm-dd以实际数字为格式,如输入"format",则严格按照yyyy-mm-dd格式输出。
返回:
命令返回推导的日期结果

例:
1,求2006年3月12日后45天的对应日期,格式输出
[bigboar@bigboar deduce_date]$ date_deduce_days 2006-03-12 45 format
2006-04-26

2,求2006年3月12日后45天的对应日期,不格式输出(默认就是非格式输出)
[bigboar@bigboar deduce_date]$ date_deduce_days 2006-03-12 45
2006-4-26

3,求2006年3月12日前45天的对应日期,格式输出
[bigboar@bigboar deduce_date]$ date_deduce_days 2006-03-12 -45 format
2006-01-26

4,求2006年3月12日前45天的对应日期,不格式输出(默认就是非格式输出)
[bigboar@bigboar deduce_date]$ date_deduce_days 2006-03-12 -45
2006-1-26


命令:deduce_month
接受3个参数:
$1,输入一个以yyyy-mm为格式的日期,如2006-9
$2,输入推导的月数,若往$1以后推导,则输入一个正整数(+正号要忽略)推导月数,若往$1以前的时间推导,则输入一个负整数推导月数。
$3,固定参数为"format",可不输入,不输入时,命令返回的yyyy-mm以实际数字为格式,如输入"format",则严格按照yyyy-mm格式输出。
返回:
命令返回推导的日期结果

命令:comp_month_days
接受1个参数:
$1,yyyy-mm,如2006-8
返回:
命令返回输入的该年的该月所具有的天数

例:
[bigboar@bigboar deduce_date]$ comp_month_days 2006-2
28

说明2006年的2月份有28天。







bigboar 发表于:2006.09.16 00:27 ::分类: ( Linux ) ::阅读:(414次) :: 评论 (0) :: 引用 (0)

发表评论

标题

在此添加评论

称呼

邮箱地址(可选)

个人主页(可选)


authimage