perl 时间函数(timelocal,localtime,strftime)小用
2013-05-16 17:02
555 查看
近期依然要投入到万恶的维护行列,确实不是什么好事情。
不过也没法,工资上的去,暂时潜心学习呗。
因为项目是新确立的,所以所有的维护脚本都要自己去编写。
其中最烦的莫过于自己对perl不熟,还要写perl脚本。
这次讲几个perl时间函数的用法,在维护中比较常用。
目录:(以后再用到会更新)
一、Time::Local 集合。
二、POSIX qw(strftime)函数。
一、Time::Local 集合。
这个集合里面主要会用到以下函数:
timelocal()、localtime()。
timelocal()是从格式化的时间输入转换成秒;而localtime()是从秒转换成格式化的时间。
用perl的来表示就是如下结果:
my $second_str = timelocal($ss,$mi,$hh,$dd,$mm,$yy);
our ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime($second_str);$year = $year+1900;
不过这个localtime 稍稍有点复杂,它有两种方式的输出,一种就是如上这一种的数组赋值方式,一种就是直接输出:print localtime($second_str);
这两种的输出结果是不一样的。如下:
输出结果:
可以看出,同一个timelocal输出得到的second_str,两种输出方式得到的日期和结果是不一样的。
一个是6月16日,一个是5月16日。差了一个月之多~~~~~
很让人崩溃吧。
所以如果使用第一种方式(直接调用,非数组赋值)输出 localtime ,在计算 timelocal 的 second_str 之时,月份要减一,不过第二种的数组赋值方式最后输出的年份要加 1900 才能得到正确的结果。
另外,系统还自带一个 time() 函数,默认返回当前系统时间的 timelocal 。而且还自动月份减一了。
这就有点悲剧了,如果是使用数组方式赋值的话,这个time就不能用了。
话说,这两个函数有什么用捏?
主要用途是用来计算 时间差 的。
以下函数请保存成模板,随时可以调用。
测试输出结果:
二、POSIX qw(strftime)函数。
讲了这么多,终于到第二个内容,这个简单很多。
使用这个函数,就不用像前面那样使用数组输出这么多参数了,直接利用strftime函数的时间域定义一下格式就O了。
使用:
会输出
2010-08-21 07:44:24
就能格式化输出啦,前提是你懂得了前面第一部分的localtime的用法。
这个就不多说了,让大家慢慢去体会。
附上
转载请说明出处,谢谢。
----------------------------------------------------------------------
参考文献:
1.
perldoc.perl.org
2.
扶 凯's blog
不过也没法,工资上的去,暂时潜心学习呗。
因为项目是新确立的,所以所有的维护脚本都要自己去编写。
其中最烦的莫过于自己对perl不熟,还要写perl脚本。
这次讲几个perl时间函数的用法,在维护中比较常用。
目录:(以后再用到会更新)
一、Time::Local 集合。
二、POSIX qw(strftime)函数。
一、Time::Local 集合。
这个集合里面主要会用到以下函数:
timelocal()、localtime()。
timelocal()是从格式化的时间输入转换成秒;而localtime()是从秒转换成格式化的时间。
用perl的来表示就是如下结果:
my $second_str = timelocal($ss,$mi,$hh,$dd,$mm,$yy);
our ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime($second_str);$year = $year+1900;
不过这个localtime 稍稍有点复杂,它有两种方式的输出,一种就是如上这一种的数组赋值方式,一种就是直接输出:print localtime($second_str);
这两种的输出结果是不一样的。如下:
perl -e ' use Time::Local; our ($ss,$mi,$hh,$dd,$mm,$yy) = (0,0,0,16,5,2013); my $second_str = timelocal($ss,$mi,$hh,$dd,$mm,$yy); print timelocal($ss,$mi,$hh,$dd,$mm,$yy)."\n"; our ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime($second_str);$year = $year+1900; print localtime($second_str)."\n"; print "$year-$mon-$day $hour:$min:$sec $isdst:$yday:$wday\n";'
输出结果:
1371312000 Sun Jun 16 00:00:00 2013 2013-5-16 0:0:0 0:166:0
可以看出,同一个timelocal输出得到的second_str,两种输出方式得到的日期和结果是不一样的。
一个是6月16日,一个是5月16日。差了一个月之多~~~~~
很让人崩溃吧。
所以如果使用第一种方式(直接调用,非数组赋值)输出 localtime ,在计算 timelocal 的 second_str 之时,月份要减一,不过第二种的数组赋值方式最后输出的年份要加 1900 才能得到正确的结果。
另外,系统还自带一个 time() 函数,默认返回当前系统时间的 timelocal 。而且还自动月份减一了。
这就有点悲剧了,如果是使用数组方式赋值的话,这个time就不能用了。
话说,这两个函数有什么用捏?
主要用途是用来计算 时间差 的。
以下函数请保存成模板,随时可以调用。
#!/usr/bin/perl use Time::Local; sub second_str_cal{ #用于计算形似 20130516 这种日期的秒钟数 #input:($date_by_"YYYYMMDD") #output:($second_str1,$second_str2) $_cnt = @_; unless ( $_cnt == 1 and length($_[0]) == 8 ){print "Worng input, please use input like: second_str_cal(20130516) \n"; exit;} my ($ss,$mi,$hh,$dd,$mm,$yy) = (0,0,0,substr($_[0],6,2),substr($_[0],4,2),substr($_[0],0,4)); my $second_str1 = timelocal($ss,$mi,$hh,$dd,$mm,$yy); my $second_str2 = timelocal($ss,$mi,$hh,$dd,$mm-1,$yy); "$second_str1,$second_str2"; } sub format_time{ #用于格式化输出日期,依赖 second_str_cal 函数 #input:($second_str1,$second_str2) #output:($date_by_"YYYYMMDD",$week_day) $_cnt = @_; unless ( $_cnt == 2 ){print "Worng input, please use input like: format_time(1368692601,1368692601) \n"; exit;} my ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime($_[0]); $year = $year + 1900; my ($week_day) = split(" ",localtime($_[1])); "$year$mon$day,$week_day"; } sub two_day_minus{ #用于计算两个日期的差,依赖 second_str_cal 函数 #input:($date1_by_"YYYYMMDD",$date2_by_"YYYYMMDD") #output:($day_minus) $_cnt = @_; unless ( $_cnt == 2 and length($_[0]) == 8 and length($_[1]) == 8 ){print "Worng input, please use input like: format_time(20130515,20130516) \n"; exit;} my ($second_str1_1) = split(",",second_str_cal("$_[0]")); my ($second_str2_1) = split(",",second_str_cal("$_[1]")); my $day_minus = ($second_str2_1-$second_str1_1)/24/60/60; $day_minus = - $day_minus if($day_minus <0); "$day_minus"; } sub n_day_before{ #用于计算某天的前几天是什么日期,依赖 second_str_cal、format_time 函数 #input:($date1_by_"YYYYMMDD",$n) #output:($date1_by_"YYYYMMDD") $_cnt = @_; unless ( $_cnt == 1 and length($_[0]) == 8 ){print "Worng input, please use input like: second_str_cal(20130516) \n"; exit;} my ($second_str1,$second_str2) = split(",",second_str_cal("$_[0]")); my $second_str1_minus = $second_str1 - $_[1]*24*60*60; my $second_str2_minus = $second_str2 - $_[1]*24*60*60; my ($date_by_day,$week_day) = split(",",format_time($second_str1_minus,$second_str2_minus)); "$date_by_day,$week_day"; } #******************************************************* my $user_day="20130516"; my ($str1,$str2) = split(",",second_str_cal("$user_day")); my ($a,$b) = split(",",format_time($str1,$str2)); print "\nUser day is:$a, and the week day is:$b\n"; #******************************************************* #******************************************************* my $day1="20130516"; my $day2="20130512"; my $c = two_day_minus($day1,$day2); my $d = two_day_minus($day2,$day1); print "\n$day2 - $day1 = $c(days) $day1 - $day2 = $d(days)\n"; #******************************************************* #******************************************************* my $day3="20130516"; my $n1=3; my $n2=-2; my $e = n_day_before($day3,$n1); my $f = n_day_before($day3,$n2); print "\n$day3\'s $n1 days before is $e; $day3\'s $n2 days before is $f\n\n"; #*******************************************************
测试输出结果:
User day is:2013516, and the week day is:Thu 20130512 - 20130516 = 4(days) 20130516 - 20130512 = 4(days) 20130516's 3 days before is 2013513,Mon; 20130516's -2 days before is 2013518,Sat
二、POSIX qw(strftime)函数。
讲了这么多,终于到第二个内容,这个简单很多。
使用这个函数,就不用像前面那样使用数组输出这么多参数了,直接利用strftime函数的时间域定义一下格式就O了。
使用:
#!/usr/bin/perl use POSIX qw(strftime); print strftime("%Y-%m-%d %H:%M:%S\n", localtime(time));
会输出
2010-08-21 07:44:24
就能格式化输出啦,前提是你懂得了前面第一部分的localtime的用法。
这个就不多说了,让大家慢慢去体会。
附上
Strftime 时间域 (这个和 date 的命令的字符格式是一样的): %H: 小时(00..23) %I: 小时(01..12) %k: 小时(0..23) %l: 小时(1..12) %M: 分(00..59) %p: 显示出AM或PM %r: 时间(hh:mm:ss AM或PM),12小时 %s: 从1970年1月1日00:00:00到目前经历的秒数 %S: 秒(00..59) %T: 时间(24小时制)(hh:mm:ss) %X: 显示时间的格式(%H:%M:%S) %Z: 时区 日期域 %a: 星期几的简称( Sun..Sat) %A: 星期几的全称( Sunday..Saturday) %b: 月的简称(Jan..Dec) %B: 月的全称(January..December) %c: 日期和时间( Mon Nov 8 14:12:46 CST 1999) %d: 一个月的第几天(01..31) %D: 日期(mm/dd/yy) %h: 和%b选项相同 %j: 一年的第几天(001..366) %m: 月(01..12) %w: 一个星期的第几天(0代表星期天) %W: 一年的第几个星期(00..53,星期一为第一天) %x: 显示日期的格式(mm/dd/yy) %y: 年的最后两个数字( 1999则是99) %Y: 年(例如:1970,1996等)
转载请说明出处,谢谢。
----------------------------------------------------------------------
参考文献:
1.
perldoc.perl.org
2.
扶 凯's blog
相关文章推荐
- 【python】详解time模块功能asctime、localtime、mktime、sleep、strptime、strftime、time等函数以及时间的加减运算
- linux常用的时间获取函数(time,gettimeofday,clock_gettime,_ftime,localtime,strftime )
- 时间函数(date/time/datetime/julianday/strftime) -- sqlite
- Perl 三种时间time,localtime,gmttime
- windows平台时间函数性能比较QueryPerformanceCounter,GetTickCount,ftime,time,GetLocalTime,GetSystemTimeAsFileTim
- Windows获取时间函数(使用GetLocalTime,GetSystemTime,SystemTimeToTzSpecificLocalTime,GetFileTime API函数
- Perl localtime时间函数的应用介绍
- (转)windows平台时间函数性能比较QueryPerformanceCounter,GetTickCount,ftime,time,GetLocalTime,GetSystemTimeAsFileTime
- 通过Run-Time Library中的time和localtime函数获取系统时间
- windows平台时间函数性能比较QueryPerformanceCounter,GetTickCount,ftime,time,GetLocalTime,GetSystemTimeAsFileTim
- Linux下时间编程(综合知识+综合编程):time,ctime,strftime,localtime,gmtime,gettimeofday
- windows平台时间函数性能比较QueryPerformanceCounter,GetTickCount,ftime,time,GetLocalTime,GetSystemTimeAsFileTime
- windows平台时间函数性能比较QueryPerformanceCounter,GetTickCount,ftime,time,GetLocalTime,GetSystemTimeAsFileTim
- perl的时间处理之localtime和strftime
- Linux时间函数之gettimeofday()函数之使用方法
- C语言linux环境下使用gettimeofday函数得到程序运行时间
- VC++获取当前系统时间日期 GetSystemTime()函数的用法
- 浅谈时间函数gettimeofday的成本
- localtime()函数:获取当前时间和日期并转换为本地时间
- mysql 中 unix_timestamp和from_unixtime 时间戳函数