Perl获取UTC时间并获得UTC时间戳之间的差异

时间:2012-02-06 18:55:02

标签: linux perl bash shell

我正在寻找一些关于如何正确执行此操作的Perl帮助。我不介意使用库来做到这一点。

我从mySQL数据库中提取UTC时间戳,格式为:2012-02-06 13:50:09

我需要Perl来提取当前的UTC时间,并以分钟(或秒)为单位获得两个时间戳之间的差异。我在Unix子进程中这样做,但是我很难获得UTC时间并进行比较,因为本地盒子在东部时间运行。我不介意在Unix时间执行此操作,但不确定如何准确地将UTC时间与“last_timestamp”进行比较,后者是来自mysql的基于UTC的时间戳。

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

一如既往,您的帮助肯定受到赞赏和重视。

5 个答案:

答案 0 :(得分:14)

  1. 范式错误。 Unix机箱不“在东部时间运行”或“在太平洋时间运行”。 Unix框运行“自纪元以来的秒数”,并具有默认时区,用于向用户表示时间值。一旦你理解了这一点,许多其他有用的东西都是免费的。

  2. 您可以使用'date -u'

  3. 让'date'返回UTC时间
  4. Perl的time内置函数返回自纪元以来的秒数(没有时区)。然后,您可以使用Perl的gmtime内置函数将其转换为UTC Y-M-D-H-M-S值。在没有任何参数的情况下调用gmtime实际上与gmtime(time)相同。

  5. 使用DateTime::Format::MySQL解析MySQL日期/时间值。您可能还会发现DateTime有用。另请参阅http://datetime.perl.org/

答案 1 :(得分: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";

答案 2 :(得分: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 :(得分:0)

  1. 致电time
  2. MySQL
  3. 获取UNIX_TIMESTAMP(your_datetime_field)
  4. 减。
  5. Div和mod 60。
  6. sprintf ("%02d min %02d s", $delta_min, $delta_s);

答案 4 :(得分:0)

使用时间::本地;

我的@t =当地时间(时间); 我的$ gmt_offset_in_seconds = timegm(@t)-timelocal(@t);


您有了偏移量,现在可以根据偏移量随时进行调整。