2015-02-10 49 views
2

我有以下字符串格式的日期,我需要使用Perl腳本將其轉換爲毫秒。我試圖用DateTime::Format::Strptime進行轉換,並在轉換爲毫秒後返回0。解析日期字符串以毫秒爲單位,反之亦然

日期字符串:15年1月13日:14.16

#!/usr/bin/perl 
use DateTime::Format::Strptime; 

my $strp = DateTime::Format::Strptime->new(
    pattern => '%m-%d-%y:%H.%M', 
    on_error => 'croak', 
); 

my $dt = $strp->parse_datetime("01-13-15:14.16"); 

print $dt->millisecond."\n"; 

我怎麼能轉換日期時間爲毫秒

+0

不會轉換爲毫秒,它只返回毫秒級的時間,即0。 請更好地解釋您希望在此處實現的目標,我們將能夠爲您提供幫助 – 2015-02-10 13:09:03

+0

我想將日期字符串轉換爲毫秒。這是我在閱讀[this]後試圖做的(http://stackoverflow.com/questions/7486470/how-to-parse-a-string-into-a-datetime-object-in-perl)和這個[這](http://stackoverflow.com/questions/4254464/parsing-datetime-in-perl-correct-to-micro-nano-seconds)的例子。沒有毫秒部分,它將datetime返回爲'2015-01-13T14:16:00' – Sajirupee 2015-02-10 13:12:39

+0

您正在解析沒有設置毫秒的日期時間,因此您將有0毫秒的時間返回。任何分辨率高於你通過的分辨率都將導致零(它不會僅僅憑空製造出一些東西) 目前還不清楚你想要什麼。如果您想要將日期時間轉換爲自紀元以來的秒數,請使用它。 'print sprintf(「%f」,$ dt-> epoch + $ dt-> millisecond);' – 2015-02-10 13:23:36

回答

4

我認爲這很可能是你想要的是不是毫秒,但epoch,這是自1月1日1970年您的日期,時間格式既不秒鐘也不毫秒數,所以這兩個領域的將被報告爲零,並且如果確實是想要毫秒,那麼您可以簡單地將epoch乘以1000。

它看起來像這樣

use strict; 
use warnings; 
use 5.010; 

use DateTime::Format::Strptime; 

my $strp = DateTime::Format::Strptime->new(
    pattern => '%m-%d-%y:%H.%M', 
    on_error => 'croak', 
); 

my $dt = $strp->parse_datetime('01-13-15:14.16'); 
say $dt->epoch; 

輸出

1421158560 

然而,DateTime模塊是巨大的,緩慢的,有核心模塊Time::Piece在一個更好的解決方案,這將看像這樣

use strict; 
use warnings; 
use 5.010; 

use Time::Piece; 

my $dt = Time::Piece->strptime('01-13-15:14.16', '%m-%d-%y:%H.%M'); 
say $dt->epoch; 

輸出

1421158560 
+0

謝謝。我會修改我的腳本使用'Time :: Piece'而不是'DateTime' – Sajirupee 2015-02-11 11:06:30

2

這是不可能的日期轉換爲毫秒。日期是一個時間點。毫秒測量持續時間。

如果我們假設您的意思是「我的給定日期/時間和其他固定日期/時間之間有多少毫秒」,那麼您的問題纔有意義。由於Unix測量時間的方式,讓我們假設您測量的固定日期/時間是Unix Epoch(1970-01-01 00:00:00)。

您使用epoch()方法得到自DateTime對象出現以來的秒數。

say $dt->epoch; 

要獲得毫秒數,只需乘以一千。

say 1000 * $dt->epoch; 

您當前的時間戳記不包含毫秒。如果您更改爲解析包含它們的字符串,那麼您也可以添加該值。

say $dt->milliseconds + (1000 * $dt->epoch); 
+0

我想你的意思是說'說1000 * $ dt->紀元+ $ dt->毫秒' – Borodin 2015-02-10 14:35:21

+0

你是對的。謝謝。固定。 – 2015-02-10 14:42:01

1

添加我的評論作爲一個答案:

如果你想將datetime值轉換成秒以來的時代,請嘗試以下之一:

print sprintf("%f", $dt->epoch + ($dt->millisecond/1000)); 
print sprintf("%s.%s", $dt->epoch, $dt->millisecond); 

(我原來的評論沒有考慮毫秒爲整數)

類似於mi中的值lliseconds,而不是seconds.millis:

print sprintf("%d", ($dt->epoch * 1000) + $dt->millisecond); 
print sprintf("%d%04d", $dt->epoch, $dt->millisecond); 

記住,如果你不使用含值毫秒(或更高分辨率)提供日期時間,價值只會是零。

+0

謝謝你的回答。 :) – Sajirupee 2015-02-11 11:07:11

相關問題