2012-02-06 174 views
4

我正在尋找一些Perl幫助,以瞭解如何正確執行此操作。我不介意使用圖書館來做到這一點。Perl獲取UTC時間並獲得UTC時間戳之間的差異

我從MySQL數據庫拉着一個UTC時間戳,格式爲:2012-02-06 13點50分09秒

我需要Perl來拉動當前UTC時間,並獲得之間的差異兩分鐘(或幾秒)的時間戳。我在Unix子進程中這樣做,但我很難獲取UTC時間並進行比較,因爲本地機器在東部時間運行。我不介意在Unix時間這樣做,但不知道如何準確獲取UTC時間,以便與來自mysql的UTC時間戳「last_timestamp」進行比較。

my $date_diff = qx(date -d "\$(date +'%F %T')" +%s) - 
qx(date -d   "$last_timestamp" +%s); 

一如既往,您的幫助肯定會受到讚賞和重視。

回答

0
  1. 呼叫time
  2. UNIX_TIMESTAMP(your_datetime_field)從MySQL
  3. 減。
  4. 股利以及mod 60
  5. sprintf ("%02d min %02d s", $delta_min, $delta_s);
2

的一種方法是使用核心Time::Piece

#!/usr/bin/env perl 
use strict; 
use warnings; 
use Time::Piece; 
my $when = q(2012-02-06 13:50:09); 
my $t = Time::Piece->strptime($when, "%Y-%m-%d %H:%M:%S"); 
print "delta seconds = ", time() - $t->strftime("%s"),"\n"; 
1

下面是使用DateTime

use strict; 
use warnings; 
use DateTime; 

my $date_str="2012-02-06 13:50:09"; 

my ($year,$month,$day,$hour,$min,$sec); 

if($date_str=~/^(\d{4})\-(\d{2})\-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/) 
{ 
    $year=$1; 
    $month=$2; 
    $day=$3; 
    $hour=$4; 
    $min=$5; 
    $sec=$6; 
} 
else 
{ 
    die "Couldn't parse timestamp $date_str\n"; 
} 

my $dt=DateTime->new(
    year=>$year, 
    month=>$month, 
    day=>$day, 
    hour=>$hour, 
    minute=>$min, 
    second=>$sec, 
    time_zone=>"UTC" 
); 

my $now=DateTime->now; 
$now->set_time_zone("UTC"); 

my $difference=$now->delta_ms($dt); 

print "The difference is " . (60*($difference->minutes) + ($difference->seconds)) . " seconds\n"; 

溶液的輸出:

The difference is 2078 seconds 

這聽起來是正確的。

+3

如果要分析一個MySQL時間戳,使用的DateTime ::格式:: MySQL的 – zgpmax 2012-02-06 19:27:26

14
  1. 範式錯誤。 Unix盒子不能「在東部時間運行」或「在太平洋時間運行」。 Unix盒子運行在「紀元以來的秒數」,並且有一個默認時區用於向用戶表示時間值。一旦你明白了這一點,許多其他有用的東西都是免費的。

  2. 您可以使用「日期-u」

  3. Perl的time內置函數返回紀元以來的秒數使「日期」返回UTC時間(沒有時區)。然後,您可以使用Perl的gmtime內置函數將其轉換爲UTC Y-M-D-H-M-S值。不帶任何參數調用gmtime實際上與gmtime(time)相同。

  4. 使用DateTime::Format::MySQL來解析MySQL日期/時間值。您也可能會發現DateTime有用。此外,請參閱http://datetime.perl.org/

+0

+10(1)。 :) – ikegami 2012-02-06 20:25:20

+1

你不必調用'gmtime(time)','gmtime()'將會*調用'time()'給你。 (添加到答案) – 2012-02-07 00:13:14