回答
我假設如果給定的日期是星期一,你想要相同的日期(而不是前一個星期一)。下面是與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";
(事實上,週一的特殊情況下,% 7
是沒有必要的,因爲$date->day_of_week - 1
將始終爲0 – 6,並認爲國防部7是無糖。OP但隨着% 7
,它適用於任何所需日的一週,而不僅僅是星期一)
如果你確實想在上週一,你可以改變減法:
$date->subtract(days => ($date->day_of_week - $desired_dow) % 7 || 7);
如果您需要解析在命令行中輸入的日期,則可能需要查看DateTime::Format::Natural。
在CPAN上有很多方法可以做到這一點和很多日期/時間模塊,但DateTime是迄今爲止用於處理日期和時間的最佳模塊。 – 2011-06-07 09:42:38
Zeller's congruence會給你星期幾。從那裏它應該很容易。
你也可以使用Time :: ParseDate,它理解「上週一」。
一個班輪維護Perl的聲譽:
perl -MTime::ParseDate -M'POSIX qw(strftime)' -l -e'foreach (@ARGV) { my $now= parsedate($_); my $e= parsedate("last Monday", NOW => $now) ; print "$_ : ", strftime "%F", localtime($e)}' 2011-06-11 2011-06-12 2011-06-13 2011-06-14
而一個健全的腳本:
#!/usr/bin/perl
use strict;
use warnings;
use Time::ParseDate; # to parse dates
use POSIX qw(strftime); # to format dates
foreach my $date (@ARGV)
{ my $date_epoch= parsedate($date) || die"'cannot parse date '$date'\n";
my $monday= parsedate("last Monday", NOW => $date_epoch); # last Monday before NOW
print "Monday before $date: ", strftime("%F", localtime($monday)), "\n"; # %F is YYYY-MM-DD
}
有兩點要注意:如果日期是星期一,那麼你得到的以前星期一,這可能會或可能不是你想要的,改變現在只需設置到第二天(每天添加60 * 60 * 24,到$ date_epoch)。然後Time :: ParseDate非常自由,例如2011-23-38會很高興解析(如2012-12-09)。
很簡單的東西,使用標準的Perl庫。
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Time::Local;
use POSIX 'strftime';
my $date = shift || die "No date given\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);
while (strftime('%u', localtime $now) != 1) {
$now -= 24 * 60 * 60;
}
我將把它留作練習,讓讀者查閱所使用的各種模塊和功能。
如果您使用DateTime,它可能會更簡單。
本着Perl的精神,有很多方法可以做到這一點。
use Modern::Perl;
use Date::Calc qw/Day_of_Week/;
my $date = '2011/6/11';
my @fields = split /\//, $date;
my @new_date = Add_Delta_Days(@fields , 1 - Day_of_Week(@fields));
say join "/", @new_date;
你可以使用Date::Manip,其中有一個Date_GetPrev
功能和理解 「星期一」
$ perl -MDate::Manip -le 'print UnixDate(Date_GetPrev(shift, "Monday", 0), "%Y-%m-%d")' 2011-06-11
2011-06-06
在本月底,$tstamp
將有時間戳你想:
use strict;
use warnings;
use POSIX qw<mktime>;
my $time = '2011-06-11';
my ($year, $month, $day) = split /-0?/, $time;
my $tstamp = mktime(0, 0, 0, $day, $month - 1, $year - 1900);
my $dow = (localtime $tstamp)[6];
$tstamp -= (($dow > 1 ? 0 : 7) + $dow - 1) * 24 * 60 * 60;
這假定「上週一」是指最近一次發生在星期一之前的到指定日期。「因此,如果星期幾是星期一(1),那麼它會減去另外的7。
你對你的偏好進行測試,2011-06-07(星期二)將返回2011-05-30的時間戳。 – 2011-06-07 15:31:51
@ Ven'Tatsu啊,我超過了自己。我測試,發佈,然後閱讀比較錯誤,並急匆匆地將其更改爲2. – Axeman 2011-06-07 15:36:57
如果你是一個像我這樣的奴隸,並且必須使用沒有庫的公司Perl,並且不允許你安裝它們,老式方法:
my $datestring = "";
my $secondsEpoc = time(); #gives the seconds from system epoch
my $secondsWantedDate;
my $seconds2substract;
$datestring = localtime($secondsEpoc);
print "Today's date and time ".$datestring."\n";
my ($second,$minute,$hour,$d,$M,$y,$wd,$yd) = (localtime)[0,1,2,3,4,5,6,7];
#print "hour: ".$hour;
#print "minute: ".$minute;
#print "second: ".$second;
#print "week day: ".$wd; #week day is 1=Monday .. 7=Sunday
$seconds2substract = 24 * 60 * 60; # seconds in 24 hours
$secondsWantedDate=$secondsEpoc-$seconds2substract;
$datestring = localtime($secondsWantedDate);
print "Yesterday at the same time ".$datestring."\n";
my $days2Substract = $wd-1;
$seconds2substract = ($days2Substract * 24 * 60 * 60);
$secondsWantedDate=$secondsEpoc-$seconds2substract;
$datestring = localtime($secondsWantedDate);
print "Past Monday same time ".$datestring."\n";
$seconds2substract = ($days2Substract * 24 * 60 * 60) + ($hour *60 *60) + ($minute * 60) + $second;
$secondsWantedDate = $secondsEpoc-$seconds2substract;
$datestring = localtime($secondsWantedDate);
print "Past Monday at 00:00:00 ".$datestring."\n";
希望它可以幫助別人
有很多方法可以做到這一點在Perl下面是如何將其與Perl庫進行Moment
#!/usr/bin/perl
use strict;
use warnings FATAL => 'all';
use feature 'say';
use Moment;
sub get_monday_date {
my ($date) = @_;
my $moment = Moment->new(dt => "$date 00:00:00");
my $weekday_number = $moment->get_weekday_number(first_day => 'monday');
my $monday = $moment->minus(day => ($weekday_number - 1));
return $monday->get_d();
}
say get_monday_date('2011-06-11'); # 2011-06-06
- 1. 查找給定日期的星期幾
- 2. 如何使用perl查找給定日期的下一個日期?
- 3. 獲取基於給定日期的星期一至星期日
- 4. 獲取從給定日期星期一到星期五的星期日期
- 5. 查找上個星期日的日期從當前日期
- 6. jquery日期 - 確定一個星期日?
- 7. 從給定日期查找星期日的第一個匹配項
- 8. 如何在給定日期的perl中查找以前的日期
- 9. 查找下一個星期一的Java日期6:00,例如
- 10. 在給定日期(bash)後獲取下一個星期日
- 11. 上個星期一的日期Excel
- 12. 查找當前星期的開始日期(星期一)
- 13. 如何在Java中找到前兩個星期一的日期?
- 14. 查找第一個可用日期,給定SQL日期範圍
- 15. Django的日期字段得到一個星期就像星期日星期一
- 16. 找到2個給定日期有多少個星期日?
- 17. 如何使用日期+%u與給定的一天來查找星期幾號
- 18. 查找最後一個星期日
- 19. 如何僅獲取星期一在兩個給定日期之間的月份的最後一天的日期
- 20. 如何找到最近的一個星期的任意日期?
- 21. 檢查一個html日期輸入是在給定日期後
- 22. 在日期列表中查找最接近的給定日期
- 23. 試圖得到一個星期的第一天和最後一天的日期,給定一個任務。日期
- 24. vb.net添加一個星期到給定的日期
- 25. 上次星期一和下個星期日之間的MySQL日期
- 26. 在SQL中使用今天的日期獲取星期日期(星期一)
- 27. 根據「日期」字段查找一週的星期一
- 28. 如何計算距給定日期X個星期幾的日期?
- 29. 如何查看星期六/星期日?
- 30. PHP星期一星期一和星期六日期問題
。哈你已經去過這個了嗎?你嘗試了什麼? – Flexo 2011-06-07 07:55:04