2014-09-23 100 views
1

我想显示使用Time::Piece昨天’的日期和超载字串和算术运算象下面这样:时间::片显示昨天的日期

use strict; 
use warnings; 
use feature qw(say); 

use Time::Piece; 
use Time::Seconds; 

say " Today is " . localtime; 
say "Yesterday is " . localtime - ONE_DAY; 

Outputs

Today is Mon Sep 22 15:09:00 2014 
Yesterday is Tue Dec 30 16:00:00 1969 

然而,随着可以观察,今日’的日期有效,但昨天’ s是在时代周围。

一种解决方案是通过在做数学之前创建一个变量$today - ONE_DAY。如所期望

Yesterday is 1969-12-30 
Yesterday is 1969-12-30 
Yesterday is 2014-09-21 
Yesterday is 2014-09-21 

的第三和上述工作第四方法:此外,以下其他格式揭示的更多信息:

my $fmt = '%Y-%m-%d'; 

say "Yesterday is ", (localtime - ONE_DAY  )->strftime($fmt); 
say "Yesterday is ", (+localtime - ONE_DAY  )->strftime($fmt); 
say "Yesterday is ", (scalar(localtime) - ONE_DAY)->strftime($fmt); 
say "Yesterday is ", (- ONE_DAY + localtime  )->strftime($fmt); 

Outputs

那么’的交易?

回答

6

这可以使用B::Deparse查看的perl如何解释代码被诊断:

$ perl -MTime::Piece -MTime::Seconds -MO=Deparse -e ' 
      print "Yest is " . localtime - ONE_DAY 
      ' 
print 'Yest is ' . localtime(-86400); 
-e syntax OK 

所以问题是,localtime是治疗- ONE_DAY作为其可选参数和Minus operator -被切换到它的一元上下文。

此固定简单地使用额外的括号:

use strict; 
use warnings; 
use feature qw(say); 

use Time::Piece; 
use Time::Seconds; 

say "Today is " . localtime; 
say " Yest is " . (localtime() - ONE_DAY); 

Outputs

Today is Mon Sep 22 16:25:45 2014 
Yest is Sun Sep 21 16:25:45 2014 
相关问题