perl中的日期处理
敬业的IT人
互联网
佚名
2008-4-15 10:20:42
日期处理
作者: Nathan Torkington
日期: 2000年05月23日
from:(www.zdnet.com.cn)
<编者按:人类文明的历史进程是通过精确的日期和时间来刻划的,在20世纪即将结束的时候,让我们来看看Perl 程序员是如何处理日期的>
当新千年即将来临时,许多人才知道“millennium”这个单词中有两个“l”和两个“n”,还有些人才知道并不是所有的语言都拥有能够返回确定值的日期函数。在本栏目中,你将了解到Perl是如何处理日期的,如何避免写出存在千年虫的程序,以及在Y2.038K虫出现之前做出正确的决定。
日期是如何表示的
表示日期的方式多种多样:
"18 Jan 1973"
"18/01/1973"
"01/18/1973"
"Jan 18 1973"
"18-01-73"
"18-01-1973"
"01/73"
其中,一些格式适合用在email中,一些适用在HTTP头中, 一些适合用在支票簿中,另外一些则仅适用于信用卡,其中一些格式含义不清(如“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试图使得其库和系统调用尽量接近操作系统的处理方式。
作者: Nathan Torkington
日期: 2000年05月23日
from:(www.zdnet.com.cn)
<编者按:人类文明的历史进程是通过精确的日期和时间来刻划的,在20世纪即将结束的时候,让我们来看看Perl 程序员是如何处理日期的>
当新千年即将来临时,许多人才知道“millennium”这个单词中有两个“l”和两个“n”,还有些人才知道并不是所有的语言都拥有能够返回确定值的日期函数。在本栏目中,你将了解到Perl是如何处理日期的,如何避免写出存在千年虫的程序,以及在Y2.038K虫出现之前做出正确的决定。
日期是如何表示的
表示日期的方式多种多样:
"18 Jan 1973"
"18/01/1973"
"01/18/1973"
"Jan 18 1973"
"18-01-73"
"18-01-1973"
"01/73"
其中,一些格式适合用在email中,一些适用在HTTP头中, 一些适合用在支票簿中,另外一些则仅适用于信用卡,其中一些格式含义不清(如“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试图使得其库和系统调用尽量接近操作系统的处理方式。
- 最新文章
- 在Perl/CGI中使用模板[04-15]
- PERL与MySQL[04-15]
- Perl的经典用法[04-15]
- 用perl访问mysql数据库[04-15]
- perl连接access数据库[04-15]
- 一个例子[04-15]
- 相关文章
- 在Perl/CGI中使用模板[04-15]
- PERL与MySQL[04-15]
- Perl的经典用法[04-15]
- 用perl访问mysql数据库[04-15]
- perl连接access数据库[04-15]
- 如何在WINDOWS ME/98上以APACHE安装PERL[04-15]
