2012-03-30 37 views
9

Có cách nào để tìm ra ngày đầu tiên của tháng (ngày tối thiểu) và ngày cuối cùng của tháng (ngày tối đa), cho tháng làm đầu vào, sử dụng DateTime trong perl không?Làm cách nào để có được ngày đầu tiên và ngày cuối cùng của tháng với Thời gian chờ của Perl?

Cho đến nay, tôi đã tìm ra cách để vượt qua trong một ngày đầu tiên, ngày cuối cùng để cho tôi một loạt các ngày.

Nhưng những gì tôi muốn làm bây giờ chỉ là vượt qua trong một tháng làm đối số, giả sử 201203 và trả lại phút, tối đa.

Điều đó có thể xảy ra với DateTime không?

Ngoài ra, tôi muốn thay đổi mặt nạ định dạng ngày từ YYYYMMDD thành YYYY-MM-DD.

use strict; 
    use warnings; 
    use DateTime; 

    unless(@ARGV==2) 
    { 
     print "Usage: myperlscript first_date last_date\n"; 
     exit(1); 
    } 

    my ($first_date,$last_date)[email protected]; 

    my $date=DateTime->new(
    { 
     year=>substr($first_date,0,4), 
     month=>substr($first_date,4,2), 
     day=>substr($first_date,6,2) 
    }); 


while($date->ymd('') le $last_date) 
{ 
    print $date->ymd('') . "\n"; 
    #$date->add(days=>1); #every day 
    $date->add(days=>30); 
} 

Kết quả mong đợi:

2012-03-01 
2012-03-31 
+3

Ngày tối thiểu luôn là 1! – theglauber

Trả lời

14

DateTime làm ngày toán cho bạn. Bạn có thể nói ymd mà nhân vật bạn muốn sử dụng để tách:

use DateTime; 

my($year, $month) = qw(2012 2); 

my $date = DateTime->new(
    year => $year, 
    month => $month, 
    day => 1, 
); 

my $date2 = $date->clone; 

$date2->add(months => 1)->subtract(days => 1); 

say $date->ymd('-'); 
say $date2->ymd('-'); 

Có rất nhiều ví dụ trong "Last day of the month. Any shorter" trên Perlmonks, mà tôi tìm thấy bởi Googling "perl datetime last day of month".


Và đây là ví dụ Time::Moment. Đó là một gọn gàng hơn, tập hợp con nhanh hơn DateTime:

use v5.10; 
use Time::Moment; 

my($year, $month) = qw(2012 2); 

my $tm = Time::Moment->new(
    year => $year, 
    month => $month, 
    day => 1, 
); 

my $tm2 = $tm->plus_months(1)->minus_days(1); 

say $tm->strftime('%Y-%m-%d'); 
say $tm2->strftime('%Y-%m-%d'); 
6

đầu tiên trong ngày:

$dt->set_day(1); 

Ngày cuối cùng:

$dt->set_day(1)->add(months => 1)->subtract(days => 1); 
+8

Đừng quên gọi 'clone' nếu bạn muốn tránh thay đổi' $ dt'. – ikegami

8

Là một thay thế có là cốt lõi Perl mô-đun Time::Piece.

Đối với tháng hiện tại và năm:

perl -MTime::Piece -wE '$t=localtime;say $t->month_last_day' 
31 

Tổng quát hơn, một cái gì đó như:

use 5.010; 
use Time::Piece; 
my $MY = shift || die "Month and Year expected\n"; 
my $t = Time::Piece->strptime($MY, "%m%Y"); 
say $t->month_last_day; 

$ ./mycode 022012 
29 
9

Thật đáng ngạc nhiên, đó không phải DateTime dụ sử dụng các nhà xây dựng đặc biệt last_day_of_month cho lệnh này (ví dụ biếu không của brian d Foy):

use DateTime; 
use strict; 
use 5.010; 

my($year, $month) = qw(2012 2); 

my $date = DateTime->new(
    year => $year, 
    month => $month, 
    day => 1, 
); 

my $date2 = DateTime->last_day_of_month( 
    year => $date->year, 
    month => $date->month, 
); 

say $date->ymd('-'); 
say $date2->ymd('-'); 
0

Trong khi DateTime lớp cung cấp một hàm tạo để làm điều này, cách hiệu quả nhất để có được ngày cuối cùng của tháng từ một đối tượng DateTime hiện có là yêu cầu đối tượng tính toán nó. Lớp này đưa ra một phương thức không có giấy tờ _month_length() tính toán ngày cuối cùng của tháng rất hiệu quả. Với đối tượng DateTime của bạn được gọi là $ date, bạn có thể thử

$date->_month_length($date->year,$date->month); 

Phương pháp này không có giấy tờ, vì vậy có thể hoặc không được hỗ trợ trong phiên bản DateTime của bạn. Sử dụng cẩn thận.

Các vấn đề liên quan