2012-05-01 12 views
1

私は、指定された日付の次の月曜日の日付を返すようにしています。指定された日付がすでに月曜日である場合、日付は同じままでなければなりません。次の月曜日から指定された日付に計算する

別の投稿から、DateTimeを使用して、指定された日付の前の月曜日を計算するスクリプトが見つかりました。

use DateTime; 

my $date = DateTime->new(year => 2011, month => 6, day => 11); 
my $desired_dow = 1;   # Monday 
$date->subtract(days => ($date->day_of_week - $desired_dow) % 7); 
print "$date\n"; 

(CJMにクレジット)

私は単純に次月曜日(とない以前の1)を計算するために、これをmodifiyする方法を見つけることができません。 誰かを助けることができますか?

+1

あなたは[日時](http://search.cpan.org/~drolsky/DateTime-0.74/lib/DateTimeのドキュメントを読む場合、それはいいだろう.pm) –

+0

@Nikhil実際に私が行った..上記のメカニズム(例えば%7)は見つかりませんでした。 – caliph

答えて

2

変更

$date->subtract(days => ($date->day_of_week - $desired_dow) % 7); 

$date->add(days => ($desired_dow - $date->day_of_week) % 7); 

にしたり、必要に応じて持つことができるだけで月曜日あなたの "古い" に週を追加しました:

$date->subtract(days => ($date->day_of_week - $desired_dow) % 7); 
$date->add(days => 7); 
+0

Thx!とても有難い! – caliph

0
#!/usr/bin/perl 

use strict; 
use warnings; 

use Time::Local; 
use POSIX 'strftime'; 

my $date = shift || die "No date given\n\n\tUsage: ./test.pl 2017-07-17, please note the format, CCYY-MM-DD\n\n"; 

my @date = split /-/, $date; 
$date[0] -= 1900; 
$date[1]--; 

die "Invalid date: $date\n" unless @date == 3; 

my $now = &timelocal(0, 0, 12, reverse @date); 

do{ 
    $now += 24 * 60 * 60; 
#}while ((strftime('%u', localtime $now) != 1) && (strftime('%u', localtime $now) != 5) && (strftime('%u', localtime $now) != 3)); ## For Multiple days, in case you want to find either, next monday, friday or wednesday 
}while (&strftime('%u', localtime $now) != 1);  #Values should be from 1 to 7, including... 

my @array_of_time  = localtime($now); 
my $formatted_time  = &strftime("%Y%m%d", @array_of_time); 
print ("Next Monday-[$formatted_time]\n"); 
0

それは私には思えます受け入れられた答え(add部品)が間違っています。

これは私が使用するものです。

my $date = DateTime->now; 
my $current_dow = $date->day_of_week; 
my $desired_dow = 1; # Monday 
$date->add(days => 7 - $current_dow + $desired_dow); 
関連する問題