我正在寻找一些关于如何正确执行此操作的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);
一如既往,您的帮助肯定受到赞赏和重视。
答案 0 :(得分:14)
范式错误。 Unix机箱不“在东部时间运行”或“在太平洋时间运行”。 Unix框运行“自纪元以来的秒数”,并具有默认时区,用于向用户表示时间值。一旦你理解了这一点,许多其他有用的东西都是免费的。
您可以使用'date -u'
Perl的time
内置函数返回自纪元以来的秒数(没有时区)。然后,您可以使用Perl的gmtime
内置函数将其转换为UTC Y-M-D-H-M-S值。在没有任何参数的情况下调用gmtime
实际上与gmtime(time)
相同。
使用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)
答案 4 :(得分:0)
使用时间::本地;
我的@t =当地时间(时间); 我的$ gmt_offset_in_seconds = timegm(@t)-timelocal(@t);
您有了偏移量,现在可以根据偏移量随时进行调整。