软件测试 | 以编程方式对时间值进行编码

  • Post author:
  • Post category:其他


问题

你已经决定你的应用以某种有趣的方式来使用时间,现在你希望以特定格式生成特定的值。

解决方案

对这种工作而言,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 版权协议,转载请附上原文出处链接和本声明。