2015-09-24 152 views
1

使用perl,我試圖估計自文件創建以來的時間。 我想將本地時間轉換爲unix時間(epoch),然後把文件的unix時間減去&。Perl將本地時間轉換爲unix(epoch)時間

我面對的問題是,當我將本地時間轉換爲unixtime時,它被錯誤地轉換!

my $current = str2time (localtime(time)); 
print $current; 

我得到的結果是

2768504400 = Sun, 23 Sep 2057 21:00:00 GMT 
2421349200 = Sun, 23 Sep 2046 21:00:00 GMT 

我必須與特定的日期格式養活str2time?

+0

參見http://search.cpan.org/~rse/lcwa-1.0.0/lib/lwp/lib/HTTP/Date.pm #str2time($ str _ [,_ $ zone])獲取支持的格式列表。 – syck

+3

爲什麼不直接使用[time](http://p3rl.org/time)? – choroba

+0

你確定要使用文件的unix時間嗎?爲什麼不使用perl的stat函數來獲取文件的最後修改日期/時間並將蘋果與蘋果進行比較?像'perl -e'print(「LMD:」,scalar(localtime((stat(「README.md」))[9])),「\ nNOW:」,標量(localtime(time())) \ n「)'',它產生:'LMD:Thu Sep 17 12:08:58 2015'和'NOW:Thu Sep 24 24:58:38 2015'' – hepcat72

回答

5

你正在做一件奇怪的事 - localtime(time)需要 - 時代(time)並將其轉換爲字符串。

然後你將它轉換回來。

只需使用time()

或許更好,但-M它告訴你一個文件是多久以前修改。 (有幾天,所以你必須增加)。

例如爲:

my $filename = "sample.csv"; 
my $modification = -M $filename; 
print $modification * 84600; 

但是,如果你真的想花時間,然後再返回其轉換 - 你需要看看如何localtime(time)返回結果。

如果你這樣做:

print localtime(time); 

你得到:

5671624811542661 

因爲localtime在列表環境進行評估,所以返回值的數組。 (你可以使用它而無需解析)。

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = 
               localtime(time); 

如果你在一個標量環境下做到這一點,它返回一個字符串,表示時間:

print "".localtime(time); 

給出:

Thu Sep 24 16:09:33 2015 

但請注意 - 可能會稍微改變取決於你當前語言環境。那是可能是爲什麼str2time做的是奇怪的事情 - 因爲它對某些並不總是適用的格式做了某些假設。大問題是這樣的:

如果在日期中將月份和日期都指定爲數字,他們總是被解析,假定月份數字在日期之前。這是美國日期使用的通常格式。

你可能會更好,而不是使用Time::Piecestrftime得到一個固定的格式:

例如

use Time::Piece; 
print localtime(time) -> strftime ("%Y-%m-%d %H:%M:%S"); 

注 - Time::Piece重載localtime這樣你就可以真正地使用它(相當)透明。當然,你可以做:

print localtime(time) -> epoch; 

而且沒有來回轉換的所有忙亂做。

+1

'使用Time :: Piece; localtime(time) - > strftime(「%Y-%m-%d%H:%M:%S」)'是一種昂貴的方式來編寫'使用POSIX qw(strftime); strftime(「%Y-%m-%d%H:%M:%S」,localtime(time))' – ikegami

+0

use Time :: Piece; my $ time = Time :: Piece-> new; my $ current = $ time-> localtime; my $ current2 = $ time-> localtime-> epoch; $當前是週四09月24日十九點26分19秒2015年 $電流2是1443111979,等於星期四,2015年9月24日十六點26分十九秒GMT 爲什麼時區正在消失? – amprantino

1

您錯過了請求本地時間生成標量(字符串)而不是數組。

use Date::Parse; 
my $current = str2time (scalar(localtime(time))); 
print $current, "\n"; 
print scalar(localtime($current)),"\n"; 

perldoc -f localtime

作爲返回由時間函數將9-元件 列表與本地時​​區分析的時間值轉換爲時間。通常使用 如下:
#0 1 2 3 4 5 6 7 8
($ sec,$ min,$ hour,$ mday,$ mon,$ year,$ wday,$ yday,$ isdst)= localtime (時間);
...
在標量上下文中,「localtime()」返回ctime(3)值:
$ now_string = localtime; #例如「Thu Oct 13 04:54:34 1994」