问题
你已经决定你的应用以某种有趣的方式来使用时间,现在你希望以特定格式生成特定的值。
解决方案
对这种工作而言,Perl是一件很棒的工作。你将需要Time::Local模块来对Unix时间戳进行某些处理,还需要POSIX模块中的strftime。这两个都是标准模块。例4-3中的代码演示了4中不同的格式以及如何计算它们。
例4-3:使用Perl对各种各样的时间值进行编码
#!/usr/bin/perl
use Time::Local;
use POSIX qw(strftime);
# June 1, 2008, 5:32:11pm and 844 milliseconds
$year = 2008;
$month = 5; # months are numbered starting at 0!
$day = 1;
$hour = 17; #use 24-hour clock for clarity
$min = 32;
$sec = 11;
$msec = 844;
# UNIX Time(Seconds since Jan 1,1970) 1212355931
$unixtime = timelocal($sec,$ min,$hour,$day,$month,$year);
print "UNIX\t\t\t$unixtime\n";
# populate a few values (wday,yday,isdst)that well need for strftime
($sec,$min,$hour,$mday,$mon,$year,
$wday,$yday,$isdst)= localtime($unixtime);
# YYYYMMDDhhmmss.sss 20080601173211.844
# We use strftime() because it accounts for Perl is zero-based month numbering
$timestring = strftime("%Y%m%d%H%M%S",
$sec,$min,$hour,$mday,$mom,$year,$wday,$yady,$isdst);
$timestring .= "$msec";
print "YYYYMMDDhhmmss.sss\t\$timestring\n";
# YYMMDDhhmm 0806011732
$timestring = strftime("%y%m%d%H%M",$sec,$min,$hour,$mday,
#mom,$year,$wday,$yday,$isdst);
print "YYMMDDhhmm\t\t$timestring\n";
# POSIX in "C" Local Sum Jun 1 17:32:11 2008
$gmtime = localtime($unixtime);
print"POSIX\t\t\t$gmtime\n";
讨论
你可以使用perldoc Time::Local或man strftime来找出有关于格式化时间的方法的更多信息。
警告:Perl在时间方面的古怪行为
尽管Perl非常灵活,而且无疑是完成这项工作的一件极好的工具,但它有自己的古怪行为。在编写像这样的代码时,请注意月份取值。因为一些费解的原因,它们从0开始对月份计数。也就是说,一月份对应0,二月份对应1,而不是一月份对应1.日期则不是这样。每个月的第一天对应1。此外,你需要注意的编码方式。年份从1900开始计数。因此,1999年对应99,而2008年对应108.要获得正确的年份取值,必须增加1900.尽管经历; 前年虫事件,但是至今仍有网站将日期显示为6/28/108。
版权声明:本文为cebawuyue原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。