如何从当前日期获取两个月大日期的日期



我正在尝试从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

我有两个问题:

  1. 我使用DateTime对象两次来获取结束时间。能一次搞定吗
  2. $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

最新更新