加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – Time :: Piece(localtime / gmtime)计算与bash日期

发布时间:2020-12-16 06:23:50 所属栏目:大数据 来源:网络整理
导读:有这个bash脚本: future="${1:-Dec 08 2017 22:00:00}"t1=$(date -j -f "%b %d %Y %H:%M:%S" "$future" +%s) #using OS Xt0=$(date +%s)echo "Current: $(date)"echo "Future : $future"echo "Diff : $(( $t1 - $t0 )) secs" 它打印: Current: pi 8. decem
有这个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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读