我正在嘗試從資料庫中提取資料(一些與事務相關的資料)。為了提取資料,我將開始日期和結束日期作為引數傳遞給查詢。
在這里我需要提取最近 2 個月的資料。即,開始時間為 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_time\n";
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_time\n";
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 附帶的核心模塊來做到這一點,那就太好了
uj5u.com熱心網友回復:
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_time\n";
print time2str("%d-%m-%Y %T", $start_time)."\n";
print "END:$end_time\n";
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/504252.html
上一篇:在SAS中使用Perl決議字符
下一篇:將多個切片傳遞給numpy陣列
