Perl 时间::工件(localtime/gmtime)计算与bash日期
让这个Perl 时间::工件(localtime/gmtime)计算与bash日期,perl,Perl,让这个bash脚本: future="${1:-Dec 08 2017 22:00:00}" t1=$(date -j -f "%b %d %Y %H:%M:%S" "$future" +%s) #using OS X t0=$(date +%s) echo "Current: $(date)" echo "Future : $future" echo "Diff : $(( $t1 - $t0 )) secs" 它打印: Current: pi 8. december 2017
bash
脚本:
future="${1:-Dec 08 2017 22:00:00}"
t1=$(date -j -f "%b %d %Y %H:%M:%S" "$future" +%s) #using OS X
t0=$(date +%s)
echo "Current: $(date)"
echo "Future : $future"
echo "Diff : $(( $t1 - $t0 )) secs"
它打印:
Current: pi 8. december 2017 21:25:25 CET
Future : Dec 08 2017 22:00:00
Diff : 2075 secs
结果(diff)是正确的
现在尝试使用perl执行同样的操作:
use strict;
use warnings;
use feature 'say';
use Time::Piece;
my $format = '%b %d %Y %H:%M:%S';
my $future = shift // 'Dec 08 2017 22:00:00';
say "Future: $future";
say "localtime: ", scalar localtime();
say "gmtime : ", scalar gmtime();
my $tf = Time::Piece->strptime($future, $format);
say 'localtime-diff : ', $tf-localtime();
say 'gmtime-diff : ', $tf-gmtime();
它打印
Future: Dec 08 2017 22:00:00
localtime: Fri Dec 8 21:27:45 2017 #correct
gmtime : Fri Dec 8 20:27:45 2017 #correct
localtime-diff : 5535 #incorrect (expecting 3600 secs less)
gmtime-diff : 5535 #ok
怎么了?意思是,为什么它为localtime
和gmtime
打印相同的差异,而scalar localtime
和scalar gmtime
打印不同的(正确的)字符串
编辑:所以,主要的问题是:如何使用perl获得与bash相同的结果?同时返回表示now的对象
你正在做:
2017-12-08T22:00:00+00:00 - 2017-12-08T21:25:25+01:00 # $tf-localtime()
2017-12-08T22:00:00+00:00 - 2017-12-08T20:25:25+00:00 # $tf-gmtime()
看起来你想这么做
2017-12-08T22:00:00+01:00 - 2017-12-08T21:25:25+01:00
使用Time::Piece:
use Time::Piece qw( localtime );
my $future_str = 'Dec 08 2017 23:00:00';
my $format = '%b %d %Y %H:%M:%S';
my $future_dt = localtime->strptime($future_str, $format);
say $future_dt - localtime(); # 2241 (instead of 5841)
使用日期时间:
use DateTime::Format::Strptime qw( );
my $future_str = 'Dec 08 2017 23:00:00';
my $format = DateTime::Format::Strptime->new(
pattern => '%b %d %Y %H:%M:%S',
locale => 'en',
time_zone => 'local',
on_error => 'croak',
);
my $future_dt = $format->parse_datetime($future_str);
say $future_dt->epoch - time(); # 2241 (instead of 5841)
啊。。因此,盲目复制文档,将
strtime
作为类方法调用是问题的根源:(我没有意识到,我应该(也可以)在localtime
和gmtime
上将其称为obj.method,并思考一下现在的是什么(正如您所评论的)。当有人清楚地解释它时,它是如此简单:):)非常感谢!Time::Piece->strptime(或gmtime->Time::Piece)导致生成的对象标记为UTC dt。localtime->strtime将其标记为本地dt。执行localtime->strtime
的功能是相当新的,这种行为没有文档记录,但这是唯一不干扰内部的方法。黑客已经存在了一段时间:希望他们能记录下来。@Miller,大多数人使用5.14和它附带的Time::Piece,它比那篇文章更老。@ikegami nod。那篇文章使用的是Perl5.10.1。不过,我从不费心做一份全面的版本支持清单。