Perl 用一减去日期并正确遵守日历

Perl 用一减去日期并正确遵守日历,perl,Perl,我试图用localtime减去一天,但我也需要它遵守每月格式 例如,假设今天是7月1日,我的程序将需要使用localtime显示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);

我试图用localtime减去一天,但我也需要它遵守每月格式

例如,假设今天是7月1日,我的程序将需要使用localtime显示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);

除了我存储当前日期并进行评估(如果是第一个日期),然后返回到上个月,还有谁有更好的方法吗

此代码返回当前日期前一天的日期。不确定您是否正在查找此日期。我使用此代码是为了一个非关键模拟器,所以我不担心任何极端情况

#!/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");
}

Perl将datetimes存储为自Epoc以来的秒数。Epoc通常是1970年1月1日,因为那是世界诞生的第一天

然后,Perl提供了一个接口,帮助您将内部存储的datetime转换为实际使用的时间

自Perl5.10以来,Perl附带了和模块

当然,您不必使用当前日期时间。您可以使用
Time::Piece->strtime
使用您感兴趣的任何时间:

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

%
格式可在网页中找到。

日历数学极其复杂。有些日子长达25小时(取决于时区)。偶尔会有61秒的时间。在一次挫败中,似乎有比头发更多的边缘案例需要拔掉。让我们坚持使用广泛使用的、稳定的模块。值得一看。看看如何计算昨天的日期。使用DateTime模块。它会为你做正确的事情。你不知道的规则数量惊人。
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