Perl时间处理函数使用详解

本文重点讨论perl时间处理函数的概念,perl能在绝大多数操作系统运行,可以方便地向不同操作系统迁移,并且perl借取了c、sed、awk、shellscripting以及很多其他程序语言的特性

一. Perl时间的表示函数

1. 表示日期的方式多种多样:
“18Jan1973”;
“18/01/1973”;
“01/18/1973”;
“Jan181973”;
“18-01-73”;
“18-01-1973”;
“01/73”.
其中一些格式意思不清(如”01-06-1973″,是表示6月1日呢,还是表示1月6日呢?)
如果不规定日期的表示形式,是很难处理的.

想理解”18Jan1973″和”6Sep1950″之间的区别,需要把它们转换为数字表示.
Unix内部运用纪元秒表示时间。
日期和时间加起来表示:
自格林威志时间1970年1月1日午夜时分(纪元)到当前时刻之间的秒数。
如, “18 Jan 1973:(假定为午夜时分)的纪元秒为96163200。

2. 在该系统中,午夜表示一天的开始时刻。

让我们通过Perl中提供的gmtime函数生成一个日期。
给定一个用以表示自从纪元以来的秒数的整数, 通过gmtime函数可以计算出代表相应的日期和时刻,
例一:
调用gmtime()函数,你会得到一系列值的列表,包括时,分,秒,日期,月份,年份等.

#!/usr/bin/perluse Time::localtime;$t_num = 96163200;$tm = scalar(gmtime($t_num));print $tm,"";

登录后复制

输出:
Thu Jan 18 00:00:00 1973

例二:以”,”为分隔符输出时间
print join(“,”, gmtime(96163200));

0,0,0,18,0,73,4,17,0
语义:
前3个数: 0,0,0, 分别表示秒, 分, 时. 小时是从0-23,故下午是12时往后.
第4个数: 18, 表示该月中的天数(本例中为18号)。
第5个数: 0 , 表示月份,从0开始(代表1月份)。
之所以从0开始,是因为月份对应着月份数组的下标:

@months = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);$month = @months[(gmtime($t_num))[4]];print "MONTH: ",$month,"";

登录后复制

第6个数: 73, 年份, (本例中为73)的表示有点特殊。它并不是年份的最后两位数字。
它表示从1900年开始的年份。
为什么要这样表示呢?
这是因为C语言就是这样处理的。
Perl试图使得其库和系统调用尽量接近操作系统的处理方式。
所以,如果你想输出4位数的年份,表示如下:
$year=(gmtime(96163200))[5]+1900;

如果你不了解这种处理方式,就会制造出Y2K疑问,你也许会这样写:
$year=”19″.(gmtime(96163200))[5]; #出错!2000年将变为19100
第7个数: 4 , 表示一星期中的第几天(星期日为0).
第8个数: 17, 一年中的第几天(0表示一年中的第一天).
第9个数: 0 , 能不能采用夏时制(0表示不采用,正数表示采用,负数表示不可知).

3. 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时间处理函数中(日期和时间操作)

1. 计算两个时刻之间的时间段,
只需将它们转换为相应的纪元秒,然后两数相减即可:
$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;

登录后复制

2. 计算”4天后是几号?”:

$then=time()+86400*4;print scalar(localtime($then));

登录后复制

它给出的答案精确到秒。
例如,
如果4天后的纪元秒值为932836935,你可以输出日期的字符串如下;
Sat Jul 24 11:23:17 1999

3. 输出某个日期的午夜时分
如”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()一样。

use Time::Local;$then = time() + 4*86400;$then = timegm(localtime($then)); #local epoch seconds$then -= $then%86400; #truncate to the day$then = timelocal(gmtime($then)); #back to gmt epoch secondsprint scalar(localtime$then,“”。

登录后复制

三. Perl时间处理函数中日常生活所用的日期和时间的表示

前面介绍了时,分,年等值的意思,也了解了纪元秒的意思。
而日常生活中的日期和时间是用字符串来表示的,
怎样才能把日常所用的日期和时间串格式转换成纪元秒呢?

1. 要领之一是写出语法分析小程序,该要领灵活而高速:

#!/usr/bin/perluse Time::Local;@months{qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)}=(0..11);$_ = "19 Dec 1997 15:30:02";/(dd)s+(w+)s+(d+)s+(d+):(d+):(d+)/ or die "Notadate";$mday=$1;$mon=exists($months{$2})?$months{$2}:die"Badmonth";$year=$3-1900;($h,$m,$s)=($4,$5,$6);$epoch_seconds = timelocal($s,$m,$h,$mday,$mon,$year);print "day: ",$mday,"";print "mon: ",$mon,"";print "year: ",$year,"";print "seconds: ",$epoch_seconds,"";

登录后复制

2. 一个更通用些的要领,是从CPAN安装Date::Manip模块。

useDate::Manip;$epoch_seconds=UnixDate("19 Dec 1997 15:30:02","s");

登录后复制

留心,由于Date::Manip是个大模块,运用该模块时,将会添加你的程序的启动时间。
其中一个原由是Date::Manip将对多种不同的格式执行识别,
如:
“today”
“now”
“first sunday in april 2000”
“3:15,today”
“3:15 pm,first sunday in april 2000”
“2000/01/18 09:15” Date Manipulation
2036,2037,2038,…,1901?!

四. 大多数C程序把纪元秒存为有符号整数,可表示正的和负的日期;
但计算机存储器所表示的整数大小是有限的, 用有限的位数来表示秒.
这就是说,我们在计算纪元秒时, 所表示的日期是有限定的。
确切的限度取决于你的机器所能表示的整数的位数。

Perl最多以32位的长度存储整数。
粗略地讲,有一位用来表示正负号,其余31位来表示数。
如果8位,你可以存储的最大数是255,即2的8次方减1。
故Perl中所存储的32位符号数中的最大数为:

print 2**31-1,"";2147483647

登录后复制

这个数字对应了哪个日期呢?

print scalar(gmtime(2**31-1)),"";Tue Jan 19 03:14:07 2038

登录后复制

在那个时刻的1秒之后会发生什么呢?

print scalar(gmtime(2**31)),"";Fri Dec 13 20:45:52 1901

登录后复制

对于32位有符号整数来说,2**31太大了。
它”翻卷过去了”,其符号位被置为负号,因而成为了所能表示的最大负数。
这对应于1970年开始时刻之前的秒的最大值。
其结果说明了什么呢?你不能存储gmtime(2**31)之前或gmtime(2**31-1)之后的以纪元秒表示的日期。
你可千万不要想不开,这可不是什么大疑问。
如果你要用到32位有符号整数表示的纪元秒以外的时间,你只须要改动你的表示方式,
你可从CPAN中找到不少日期模块,其中的Date::Calc和Date::Manip很可能是功能最强的两个模块。
这两个模块运用自己的日期表示方式,以防止Y1901-Y2038的限定。
Date::Manip运用罗马历法,从公元0000到公元9999。
Date::Calc也运用罗马历法,可表示的年份从1到32767。

总结

Perl时间处理函数中对于在1902-2037范围内的日期和时期表示,把它们转换为纪元秒,
要存取这些数,你只需运用整数算术运算,gmtime()和localtime()函数,以及标准的Time::Local模块。
如果要对该范围以外的日期执行计算或者要分析某特殊的日期格式,
你可以运用CPAN中的Date::Manip和Date::Calc模块。

以上就是Perl时间处理函数使用详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2266660.html

(0)
上一篇 2025年2月27日 09:28:17
下一篇 2025年2月26日 22:35:12

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 总结Perl常用字符串处理函数

    本文重点讨论perl字符串处理函数的用法,每种函数都有各自的特点和作用,需要的朋友可以参考下 下面请看本文详细介绍. Perl字符串处理函数 1. index 语法:position=index(string,substring,posit…

    编程技术 2025年2月27日
    200
  • 对比Perl字符串和整数的区别详解

    这篇文章主要介绍了详解perl字符串比较和整数比较的区别,需要的朋友可以参考下 本文向大家介绍一下Perl字符串比较和整数比较.Perl语言中Perl字符串可分为单引号和双引号字符串,那么如何进行Perl字符串比较呢,请看本文详细介绍:本文…

    编程技术 2025年2月27日
    200
  • Python常见的内建函数介绍

    所谓的内建函数,可以直接使用,而不需要import。下面这篇文章主要给大家整理介绍了关于python基础学习之常见的一些内建函数,文中通过示例代码为大家介绍的非常详细,需要的朋友可以参考借鉴,下面跟着小编来一起学习学习吧。  前言 Pyth…

    编程技术 2025年2月27日
    200
  • 实例详解Python使用回溯法子集树模板解决爬楼梯问题

    这篇文章主要介绍了python使用回溯法子集树模板解决爬楼梯问题,简单说明了爬楼梯问题并结合实例形式给出了python回溯法子集树模板解决爬楼梯问题的相关操作技巧,需要的朋友可以参考下 本文实例讲述了Python使用回溯法子集树模板解决爬楼…

    2025年2月27日
    200
  • 实例详解Python使用回溯法子集树模板获取最长公共子序列问题

    这篇文章主要介绍了python使用回溯法子集树模板获取最长公共子序列(lcs)的方法,简单描述了最长公共子序列问题并结合实例形式分析了python基于回溯法子集树模板获取最长公共子序列的操作步骤与相关注意事项,需要的朋友可以参考下 本文实例…

    2025年2月27日
    200
  • python中实现指定时间调用函数的方法讲解

    函数function是python编程核心内容之一,也是比较重要的一块。下面这篇文章主要给大家介绍了关于python中实现指定时间调用函数的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。 前言 本文主要…

    编程技术 2025年2月27日
    200
  • 有关Django模板无法使用perms变量问题的解决方法

    这篇文章主要给大家介绍了关于解决django模板无法使用perms变量问题的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。 前言 本文主要给大家介绍了关于Djan…

    2025年2月27日
    200
  • Python数据结构与算法之链表定义的使用详解

    这篇文章主要介绍了python数据结构与算法之链表定义与用法,结合具体实例形式较为详细的分析了单链表、循环链表等的定义、使用方法与相关注意事项,需要的朋友可以参考下 本文实例讲述了Python数据结构与算法之链表定义与用法。分享给大家供大家…

    编程技术 2025年2月27日
    200
  • python中map()函数的方法示例

    map()是 python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。下面这篇文章主要给大家介绍了关于python中map()函数的使用方法,…

    2025年2月27日
    200
  • python如何调用c语言函数的使用详解

    下面小编就为大家带来一篇python 调用c语言函数的实例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 虽然python是万能的,但是对于某些特殊功能,需要c语言才能完成。这样,就需要用python来调…

    编程技术 2025年2月27日
    200

发表回复

登录后才能评论