Perl语言中处理Perl日期时间的技巧

开发 架构
本文向大家简单介绍一下处理Perl日期时间的技巧,Perl语言中表现日期的方法多种多样,这里和大家分享一下,希望本文的介绍能让你有所收获。

本文和大家重点讨论一下处理Perl日期时间的技巧,这里主要从两个方面来向大家介绍,相信通过本文的学习你对Perl日期时间的处理方法有一定的认识。

处理Perl日期时间的技巧

Perl日期时间中表现日期的方法多种多样:

“18 Jan 1973″ ,”18/01/1973″ ,”01/18/1973″ ,”Jan 18 1973″ ,”18-01-73″ ,”18-01-1973″ ,”01/73″,其中一些格局含义不清(如”01-06-1973″是表现6月1日呢,还是表现1月6日呢?) 假如不规定日期的表现情势,是很难处理的。

想懂得”18 Jan 1973″和”6 Sep 1950″之间的差别,需要把它们转换为数字表现。Unix 内部应用纪元秒表现时间。日期和时间加起来表现之自格林威志时间1970年1月1日午夜时分(纪元)到当前时刻之间的秒数。”18 Jan 1973″ (假定为午夜时分) 的纪元秒为96163200。在该系统中,午夜表现一天的开端时刻。

让我们天生一个日期通过Perl中供给的gmtime函数,你可以自己来验证这点。给定一个用以表现自从纪元以来的秒数的整数,通过gmtime函数可以盘算出代表相应的日期和时刻,例如:
perl -le ‘print scalar gmtime 96163200′
Thu Jan 18 00:00:00 1973
调用 gmtime() 函数,你会得到一系列值的列表,包含时,分,秒, 日期,月份,年份等等。
perl -le ‘print join(”,”, gmtime 96163200)’
0,0,0,18,0,73,4,17,0
前面3个0分辨表现秒,分,时。小时是从0-23,故下午是12时往后。第4个数表现该月中的天数(本例中为18号)。第5个数表现月份,从0开端(代表1月份)。之所以从0开端,是由于月份对应着月份数组的下标:
@months = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); $month = (gmtime 96163200)[4]; # “Jan”

◆年份 (本例中为73)的表现有点特别它并不是年份的***两位数字。它表现从1900年开端的年份。为什么要这样表现呢?这是由于 C语言就是这样处理的。Perl试图使得其库和系统调用尽量接近把持系统的处理方法。
所以,假如你想输出4位数的年份,表现如下:
$year = (gmtime 96163200)[5] + 1900;
假如你不懂得这种处理方法,就会制作出Y2K标题,你也许会这样写:
$year = “19″ . (gmtime 96163200)[5];
# 出错! 2000年将变为19100

对于gmtime()函数的返回值还没有先容完,还有4, 17, 和 0这3个数。它们分辨表现一星期中的第几天 (星期日为0),一年中的第几天(0 表现一年中的***天), 以及是否采用夏时制(表现不采用,正数表现采用,负数表现不可知)。
Perl中的time() 函数返回以纪元秒情势表现确当前日期和时间。假如你打算把它转换为字符串,就可应用gmtime() 和localtime() 函数:
$now = localtime(time());
($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdst) = localtime(time());
假如调用 localtime() 或gmtime() 时不带参数,它将自己调用time()
$now = localtime();
($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdst) = localtime();

Perl日期时间中常见的日期和时间把持

◆假如你打算盘算两个时刻之间的时间段,只需将它们转换为相应的纪元秒,然后两数相减即可:
$difference_in_seconds = $later_datetime -$earlier_datetime;

要把秒转换为分,时,或天数,只需要分辨将它们除以60, 3600 和 86400 即可:
$difference_in_minutes = $difference_in_seconds / 60;
$difference_in_hours = $difference_in_seconds / 3600;
$difference_in_day = $difference_in_seconds / 86400;

反过来做,你也可以答复如下标题:”4天后是几号?”:
$then = time() + 86400 * 4;
print scalar localtime $then;
它给出的答案准确到秒。例如,假如4天后的纪元秒值为932836935, 你可以输出日期的字符串如下;
Sat Jul 24 11:23:17 1999

◆假如你打算输出那个日期的午夜时分 (如”Sat Jul 24 00:00:00 1999″) 应用如下模块:$then = $then - $then % 86400;      # 往掉那个日期的尾巴
类似地,你可以用四舍五进法,输出最靠近午夜时分的日期:
$then += 43200; # add on half a day
$then = $then - $then % 86400;# truncate to the day

◆假如你的时区间隔GMT为相差偶数个小时,这就管用了。并不是所有的时区都是很轻易处理的。你所真正需要的是在你自己的时区内盘算纪元秒,而不是在GMT中盘算。
Perl 中的名为Time::Local的模块,可以供给两个函数 timelocal() 和timegm()。其返回值同 localtime() 和gmtime() 一样。
 

  1. use Time::Local;  
  2. $then = time() + 4*86400;  
  3. $then = timegm localtime $then;  
  4. # local epoch seconds  
  5. $then -= $then % 86400;  
  6. # truncate to the day  
  7. $then = timelocal gmtime $then;  
  8. # back to gmt epoch seconds  
  9. print scalar localtime $then, “\n”;  

 

【编辑推荐】

  1. 解析两大Perl时间函数区别
  2. 畅谈Perl时间处理函数用法
  3. 解析Perl时间和日期模块作用
  4. Perl基础 Perl数组学习指南
  5. Perl基础 解析Perl标量和数组概念
责任编辑:佚名 来源: csdn.net
相关推荐

2010-07-19 10:01:57

Perl函数

2010-07-21 09:50:51

Perl调试

2010-07-20 10:23:24

Perl类

2010-07-19 09:16:47

Perl包

2010-07-20 10:02:15

Perl类

2010-07-26 16:23:23

Perl语言

2010-07-13 15:34:09

Perl语言

2010-07-20 11:37:00

Perl函数返回值

2010-07-23 13:23:10

Perl语言

2010-07-15 14:17:15

2010-07-13 09:14:21

Perl时间处理函数

2010-07-23 13:46:27

Perl语言

2010-07-13 10:05:54

Perl语言

2010-07-15 09:56:58

Perl语言

2010-07-23 13:07:39

Perl

2010-07-13 16:20:21

Perl 哈希表

2022-02-22 19:04:01

Perl编程语言

2010-07-19 09:45:09

Perl数组

2010-07-26 16:35:34

Perl性能

2010-07-16 12:50:45

Perl语言
点赞
收藏

51CTO技术栈公众号