2011-03-02 134 views
2

我有以下形式的巨大格式的文件:如何將日期轉換爲紀元時間?

29/01/2010 18:00 string1 string2 ..... 

30/01/2010 18:30 string3 string4 ..... 

... 

... 

dd/mm/yyyy hh:MM strings strings.... 

我需要執行基於日期的一些統計數據。

所以我想用字符串dd/mm/yyyy hh:MM代替文件中的紀元時間來執行簡單的操作。

我想最好的方法是使用Perl,但我真的不知道從哪裏開始。任何提示?

+0

即使我們不知道在哪裏start.Any提示...您還沒有提到它的時代時間.. unix,windows ...哪些?..也..你在靜態做什麼嘗試..如果你決定珍珠最適合這個.. – 2011-03-02 11:49:13

回答

4

就是這樣嗎?這種快速和骯髒的一行應該做的:

perl -MPOSIX -pwe 's{^(\d{2})/(\d{2})/(\d{4}) (\d{2}):(\d{2}) }{mktime(0,$5,$4,$1,$2-1,$3-1900)." "}e;' 

餵它標準輸入文件,它將輸出更改的版本到標準輸出。它所做的只是查找在開始時具有「dd/mm/yyyy hh:mm」的行,並將日期組件從POSIX模塊提供給mktime函數以獲取unix時間戳。

+0

你如何使用這裏面scrip但是? – dbonneville 2014-12-18 01:55:32

2
use DateTime::Format::Strptime; 

my $Strp = new DateTime::Format::Strptime(
     pattern  => '%d/%m/%Y %H:%M', 
     locale  => 'en_EN', 
     time_zone => 'UTC', 
); 

open INPUT, $file; 
while (<INPUT>) 
{ 
    my ($date, $time, $foo) = split(' ', $_, 3); 
    my $dt = $Strp->parse_datetime("$date $time"); 
    printf "%s %s", $dt->strftime('%s'), $foo; 
} 
close INPUT; 
+0

大聲笑。失戀的反應比我的更快,更骯髒。我喜歡它。推薦的! – 2011-03-02 12:20:11

+1

使用簡單的's/^(\ S + \ S +)/ $ Strp-> parse_datetime($ 1) - > epoch/e',您的響應可能會更快更骯髒。 – 2011-03-02 12:31:18

+0

感謝Christoffer的提示。我從來不習慣使用更少的代碼和保存輔助變量來編寫代碼。 – 2011-03-02 12:47:26

1

你可以使用核心模塊Time::Local

#!/usr/bin/perl 
use 5.10.1; 
use strict; 
use warnings; 
use Time::Local; 


while(<DATA>) { 
    if (m#(\d+)/(\d+)/(\d+)\s+(\d+):(\d+)\s#) { 
     say timelocal(0,$5,$4,$1,$2-1,$3); 
    } 
} 

__DATA__ 
29/01/2010 18:00 string1 string2 ..... 

30/01/2010 18:30 string3 string4 ..... 

輸出:

1264784400 
1264872600 
相關問題