我有一份报告,每周星期五运行一些数据库查询,其中数据来自星期一到星期五,并生成一个包含结果的表。当报告在星期一上周五运行时,我遇到了问题。例如,上个星期五。星期五是八月的第一天,星期一是七月二十八日。以下是我的脚本的日期和时间部分。
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
有人知道为什么如果超过两个月它似乎无法计算日期吗?
答案 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