2013-05-27 17 views
0

我找一個不那麼長的路,以產生在Perl如下:時間在Perl以下格式:20130527

獲取當前時間(月,日和年的代碼的一部分)。例如,如果我們在2013年,5月27日,輸出應爲20130527

我現在,如果我們使用「本地時間」,像

$date_str = localtime; 

的輸出格式爲:星期三七月18 07:24:05 2001 是否還有其他特殊變量可用?

回答

5

在Perl中,時間是存儲的時間爲自以來的秒數時代通常是1970年1月1日。

這使得排序和計算未來日子的時間變得很好。如果您需要知道今天30天后的情況,您可以添加2592,000(30天內的秒數)。

Perl有一個稱爲time的標準函數,它返回從The Epoch開始的秒數。然後,您可以使用localtimegmtime將其轉換爲時間元素數組(日,年,小時等)。

Perl,由於某種奇怪的原因,從來沒有一個內部函數需要一個時間元素數組並將其轉換回自Epoch以來的秒數。但是,Perl總是有一個標準模塊,它的功能timelocaltimegm。在Perl 5.0之前的日子裏,你會得到require "timelocal.pl";。在Perl 5.0中,你現在是use Time::Local;

的轉換時間來回時間元件的陣列,並且自大紀元秒之間可以是一個有點痛與localtimegmtimetimelocal,和timegm功能,並且在Perl 5.10,兩個新的模塊增加了Time::PieceTime::Seconds。這兩個模塊允許您使用內置於Time::Piece中的strptimestrftime函數來格式化時間。

如果你有Perl 5.10.0或更高,您有它容易:

use Time::Piece; 

my $time = localtime; #$time is a Time::Piece object 

# $time_string is in YYYYMMDD format 
my $time_string = sprintf "%04d%02d%02d%", $time->year, $time->month, $time->day; 

# Another way to do the above using the strftime function: 
my $time_string = $time->strftime("%Y%m%d"); 

但是你的程序應該使用的秒數,因爲大紀元爲你的程序裏面的內部時間。您應該以這種格式存儲時間。你應該以這種格式計算時間,並且你應該以這種格式傳遞所有函數的時間。

這是因爲其他Perl模塊期望這種格式的時間,更重要的是,其他Perl開發人員會以這種格式預計和維護您的代碼。

#Converting the time from YYYYMMDD to seconds since the epoch 
my $time = Time::Piece->strptime($YYYYDDMM_time, '%Y%m%d'); 
my $time_since_epoch = $time->epoch; 

#Converting time since the epoch to YYYYMMDD 
my $time = localtime($time_since_epoch); 
my $YYYYMMDD_time = $time->strftime('%Y%m%d'); 
7

您可以使用strftime從標準POSIX模塊:

use POSIX 'strftime'; 
say strftime "%Y%m%d", localtime; 

輸出:

20130526 
4

或者使用本地時間在列表上下文:

($d,$m,$y) = (localtime)[3,4,5]; 
say sprintf("%4d%02d%02d", $y+1900, $m+1, $d); 
1

你可以像下面..

use POSIX; 
my $today = POSIX::strftime('%Y%m%d', localtime); 
print "$today\n"; 

Output: 20130527