有这个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
结果(差异)是正确的.
现在尝试使用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打印相同的diff但标量localtime和标量gmtime打印不同(和正确)的字符串?
编辑:所以,主要的问题是:如何使用perl获得与bash相同的结果?
解决方法
localtime()和gmtime()都返回一个现在表示的对象.
你在做:
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)
使用DateTime:
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)