将日期减去1并正确遵守日历

时间:2013-09-12 11:16:18

标签: perl

我试图用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,如果它是第一个然后回溯到上个月?

2 个答案:

答案 0 :(得分:1)

Perl将日期时间存储为自Epoc 以来的秒数。 Epoc 通常是1970年1月1日,因为那是世界创建的第一天。

然后,Perl提供了一个界面,可以帮助您将内部存储的日期时间转换为实际使用的时间。

自Perl 5.10起,Perl附带了Time::PieceTime::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");
}