0

我试图用本地时间减去一天,但我也需要它遵守每月格式。

例如,假设现在是 7 月,我的程序需要显示 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);

除了我存储当前日期并进行评估(如果它是第一个然后回溯到上个月)之外,有没有人有更好的方法?

4

2 回答 2

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网页中找到。

于 2013-09-12T14:52:18.463 回答
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");
}
于 2013-09-12T14:34:48.000 回答