我试图用localtime减去一天,但我也需要它遵守月度格式。
例如,假设它是7月1日,我的程序将需要显示6月30日的本地时间数据,但如果我将日期减去1则不会有帮助。
my $minutes_back = 4;
my $dt = localtime( time - $minutes_back * 60 );
my $date_from=sprintf("%d/%d/%d",$dt->mon,$dt->mday,$dt->year);
有没有人有更好的方法,除了我存储当前日期和做一个eval,如果它是第一个然后回溯到上个月?
答案 0 :(得分:1)
Perl将日期时间存储为自Epoc 以来的秒数。 Epoc 通常是1970年1月1日,因为那是世界创建的第一天。
然后,Perl提供了一个界面,可以帮助您将内部存储的日期时间转换为实际使用的时间。
自Perl 5.10起,Perl附带了Time::Piece和Time::Seconds模块。
use warnings;
use strict;
use feature qw(say);
use Time::Piece;
use Time::Seconds;
my $time = Time::Piece->new; #Uses current date by default
$time -= ONE_DAY;
say $time->mdy("/");
当然,您不必使用当前的 datetime 。您可以使用Time::Piece->strptime
使用您感兴趣的任何时间:
my $date = "2013-Jan-01"; #Any format is fine
my $time = Time::Piece->strptime( $date, "%Y-%b-%d");
$time -= ONE_DAY;
say $time->mdy("/"); # Prints 12/31/2012
%
格式可在strftime网页中找到。
答案 1 :(得分:0)
此代码返回当天的前一天的日期。不确定您是否正在寻找此。我正在将此用于非关键模拟器,所以我并不担心角落情况(如果有的话)。
#!/usr/bin/perl
use strict;
use warnings;
use POSIX;
printf("%s\n",TimeStamp2Date(Date2TimeStamp('2013-07-01') - (1*24*60*60)));
# Prints date of previous day.
sub Date2TimeStamp
{
if($_[0]=~/(\d\d\d\d)-(\d\d)-(\d\d)/)
{
my @Temp=split(/-/,$_[0]);
my $Stamp=mktime(0,0,01,$Temp[2],$Temp[1]-1,$Temp[0]-1900,0,0,-1) ;
#Seconds #Minutes #Hours #Day #Month #Year
return($Stamp);
}
else
{
printf("Error:Invalid date format\n");
getc();
}
}
sub TimeStamp2Date
{
my @temp = localtime($_[0]);
my $time = join('-',reverse(sprintf("%02d",$temp[3]), # Day
sprintf("%02d",$temp[4]+1), # Month(0-11)
sprintf("%04d",$temp[5]+1900)));# Year since 1900
return("$time");
}