Perl Date计算超过两个月

时间:2014-08-04 09:53:55

标签: mysql sql perl date

我有一份报告,每周星期五运行一些数据库查询,其中数据来自星期一到星期五,并生成一个包含结果的表。当报告在星期一上周五运行时,我遇到了问题。例如,上个星期五。星期五是八月的第一天,星期一是七月二十八日。以下是我的脚本的日期和时间部分。

    my $date = `date +%Y%m%d`;
    chomp($date);
    my $time = `date +%H%M%S`;
    chomp($time);
    my $day = `date +%A`; 
    chomp($day);
    my $time = `date +%H%M%S`; 
    chomp($time);
    my $dispTime = `date +%H:%M`; 
    chomp($dispTime);

    # Set the Dates
    my $end = $date;
    my $start = $end;

    # Check the day and define start and end dates.

    if ($day eq "Friday") {
    $start = $end - 5;
    my @mytime=localtime;
    my ($s, $min, $h, $d, $m, $y) = (0, 0, 0, $mytime[3], $mytime[4], $mytime[5]);
    my $todayminus5 = strftime "%Y%m%d", $s, $min, $h, $d - 5, $m, $y;
    $start = $todayminus5;

在我的报告日志中,它会打印计算出来的日期并打印出来

    Start Date = 2014080,
    End Date = 20140801

有人知道为什么如果超过两个月它似乎无法计算日期吗?

3 个答案:

答案 0 :(得分:2)

您应该将Time::Piece与其姐妹模块Time::Seconds结合使用。如果您有一个合理的Perl版本,那么它应该已经安装,因为它是Perl 5版本10以来的核心模块。

顺便说一句,你需要从星期五到上一个星期一减去四个天!

use strict;
use warnings;

use Time::Piece;
use Time::Seconds 'ONE_DAY';

my $now = localtime;

if ($now->wdayname eq 'Fri') {
  my $monday = ($now - ONE_DAY * 4)->strftime('%Y%m%d');

  # etc.
}

答案 1 :(得分:0)

我会重做你正在采取的方法 - 你正在进行date的多次调用,这可能是一个警告标志。你有很多优势 - 从你的日子减去'5'将会给你一个负数,如果它在这个月初 - 这将打破事情 - 但是当年变化时你会遇到类似的问题。

我不会反驳上一篇文章,但我建议你简化:

my $ONE_DAY_s = 60 * 60 * 24; 
my $now = time();

my $then = $now - 4*$ONE_DAY_s;

my ( $sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($now);
$year += 1900;

print "Now: $year $mon $mday\n";

( $sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($then);
$year += 1900;

print "Then: $year $mon $mday\n";

(转录,而不是粘贴,所以要小心拼写错误)。

你可以使用$wday来判断它是否是星期五。

虽然存在这样做的模块 - 我会非常谨慎地使用外部命令的重复调用,然后尝试破坏结果。

答案 2 :(得分:0)

您可以使用Datetime模块获取开始日期和结束日期

示例:

use strict;
use warnings;

use DateTime;

my $today_date = DateTime->today();                         # Current date (Friday)
my $old_date = $today_date->clone()->subtract(days => 4);   # First DoW (Monday)

print $today_date, "\n";
print $old_date, "\n";

输出:

2014-08-04T00:00:00
2014-07-31T00:00:00