我正在尝试从DB中提取数据(一些与事务相关的数据(。为了提取数据,我将开始日期和结束日期作为参数传递给查询。
这里我需要提取过去两个月的数据。即,开始时间将为2022年6月1日,结束时间为2022年8月1日。
下面是脚本:
#!/usr/bin/perl
use strict;
use warnings;
use DateTime;
use Date::Format;
use Date::Parse;
my $nowdate = DateTime->now(time_zone => 'local');
my ($month, $year) = ($nowdate->month, $nowdate->year);
my $date = DateTime->new(
year => $year,
month => $month,
day => 1,
);
my $end_time = str2time($date);
print "END:$end_timen";
print time2str("%d-%m-%Y %T", $end_time)."n"; #printing just to see in human readable format
my $start_time = $date->clone;
$start_time->add( months => 1 )->subtract( days => 92 );
$start_time = str2time($start_time);
print "START:$start_timen";
print time2str("%d-%m-%Y %T", $start_time)."n"; #printing just to see in human readable format
我有两个问题:
- 我使用
DateTime
对象两次来获取结束时间。能一次搞定吗 $start_time->add( months => 1 )->subtract( days => 92 );
在这行代码中,我必须明确提到减去92
天,这并不总是正确的。因为有些月份有30天、31天甚至29天。如何获得2个月的开始日期
另一个例子:假设我们在2022年9月,那么开始时间和结束时间将分别为2022年7月1日和2022年9日1日。
注:Perl版本为5.16.3
如果我能用5.16.3 附带的核心模块做这件事,那就太好了
您可以通过使用truncate(to => 'month')
来简化它,以获得当月的第一个:
my $end = DateTime->now(time_zone => 'local')
->truncate(to => 'month');
然而,在没有午夜的一天,这可能会失败,因此这可能是一种选择:
my $end = DateTime->now(time_zone => 'local')
->set_time_zone('floating')
->truncate(to => 'month');
然后subtract
获得开始日期的月数:
my $start = $end->clone->subtract( months => 2 );
然后:
my $start_time = str2time($start);
my $end_time = str2time($end);
print "START:$start_timen";
print time2str("%d-%m-%Y %T", $start_time)."n";
print "END:$end_timen";
print time2str("%d-%m-%Y %T", $end_time)."n";
可能输出:
START:1654034400
01-06-2022 00:00:00
END:1659304800
01-08-2022 00:00:00