回答
我假设如果给定的日期是星期一,你想要相同的日期(而不是前一个星期一)。下面是与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