2012-02-29 47 views
2

我寫了一個Perl腳本來獲取日期時間。 它可以工作,但我不知道是否有更簡單的方法來格式化日期作爲輸出。簡單的方式來格式化日期

#!/usr/bin/perl 
use DateTime; 

my $dt   = DateTime->now(time_zone => 'local'); 
$myTimeStamp = $dt->subtract(days => 1); 
$myYear   = $myTimeStamp->year; 
$myMonth  = $myTimeStamp->month; 
if (length($myMonth) == 1) { 
    $myMonth = "0$myMonth"; 
} 
$myDay   = $myTimeStamp->day; 
if (length($myDay) == 1) { 
    $myDay = "0$myDay"; 
} 
$myHour   = $myTimeStamp->hour; 
if (length($myHour) == 1) { 
    $myHour = "0$myHour"; 
} 
#$myDir   = "/var/tmp/logs/$myYear/$myMonth/$myYear$myMonth-"; 

print "--> $myYear $myMonth $myDay $myHour\n"; 
# --> 2012 02 28 02 
exit 0; 
+0

您在$ myTimeStamp中有一個DateTime對象。 DateTime對象有一個'strftime'方法。使用它:) – 2012-02-29 16:45:21

回答

9

DateTime爲此提供了format_cldr方法:

use DateTime; 

my $myTimeStamp = DateTime->now->subtract(days => 1); 

printf "--> %s\n", $myTimeStamp->format_cldr('yyyy MM dd HH'); 
# --> 2012 02 28 02 
+4

[也](http://p3rl.org/DateTime#strftime-Patterns):'$ myTimeStamp-> strftime('%Y%m%d%H')' – daxim 2012-02-29 11:32:06

6

當然,使用POSIX模塊:

的POSIX模塊允許您訪問所有(或幾乎所有) 標準POSIX 1003.1標識符。

例子:

use POSIX; 
print POSIX::strftime('%d-%m-%Y %H:%M:%S', localtime()); 
+3

請求POSIX我的兄弟姐妹們!我會稍微偏好'strftime'解決方案作爲Perl Core的「部分」。 – Ouki 2012-02-29 11:57:51

+0

@Ouki,這指出了提供通用Perl答案的一個問題。在一個足夠成熟的代碼庫中,程序員有各種各樣的佈線習慣用法 - 不一定在CPAN上。爲了給出一個完全真實的答案,我會如何做一些事情,需要我的編程習語工具集的各種最小的輸入。如果我想要一個日期的標準格式,它可能是每次調用時傳遞相同格式的延遲。但是當一個日期被轉換爲一個字符串時,'POSIX :: strftime'就是日期變成字符串的方式。 – Axeman 2012-02-29 14:00:04

1
  • 所有總是use strict;use warnings;首先在程序的開始,並宣佈所有你的變量接近他們的第一個使用。這尤其適用於尋求幫助的情況,因爲它會發現許多並不明顯的簡單錯誤。

如果您想要零填充任何輸出,最好使用printf。也不需要提取日期字段來分隔變量。你輸出的結果是你最終想要的結果嗎?這個程序和你發佈的代碼一樣。

use strict; 
use warnings; 

use DateTime; 

my $myTimeStamp = DateTime->now->subtract(days => 1); 
printf "--> %04d %02d %02d %02d\n", map $myTimeStamp->$_, qw/year month day hour/; 

OUTPUT

--> 2012 02 28 12 
+0

我需要稍後提取日期字段以構建目錄路徑。 'printf'可能無法工作。 – conandor 2012-03-01 01:53:13

1

對於重新格式化日期,如所指出的,有POSIX核心模塊。你也可能不想看核心模塊Time::Piece,它不僅提供了strftime(),而且還提供strptime()來提供非常靈活的日期/時間解析。在5.9.5的Perl核心中出現了Time::Piece