获取一周的第一个/最后一个日期

2022-08-30 18:41:43

是否可以使用PHP的相对日期时间格式获取一周的第一个/最后一个日期?

我尝试过:

date_default_timezone_set('Europe/Amsterdam');
$date = new DateTime();

$date->modify('first day of this week'); // to get the current week's first date
echo $date->format('Y-m-d'); // outputs 2011-12-19

$date->modify('first day of week 50'); // to get the first date of any week by weeknumber
echo $date->format('Y-m-d'); // outputs 2011-12-18

$date->modify('last day of this week'); // to get the current week's last date
echo $date->format('Y-m-d'); // outputs 2011-12-17

$date->modify('last day of week 50'); // to get the last date of any week by weeknumber
echo $date->format('Y-m-d'); // outputs 2011-12-18

如您所,它没有输出正确的日期。

根据文档,如果我是正确的,这应该是可能的。

我做错了什么可怕的事情吗?

编辑

我需要使用PHP的DateTime来表示遥远未来的日期。

更新

它现在只变得更奇怪了。我又做了一些测试。

视窗 PHP 5.3.3

2011-12-01

Warning: DateTime::modify() [datetime.modify]: Failed to parse time string (first day of week 50) at position 13 (w): The timezone could not be found in the database in C:\Users\Gerrie\Desktop\ph\Websites\Charts\www.charts.com\public\index.php on line 9
2011-12-01
2011-11-30

Warning: DateTime::modify() [datetime.modify]: Failed to parse time string (last day of week 50) at position 12 (w): The timezone could not be found in the database in C:\Users\Gerrie\Desktop\ph\Websites\Charts\www.charts.com\public\index.php on line 15
2011-11-30

Linux 5.3.8

2011-12-01
2011-12-01
2011-11-30
2011-11-30

答案 1

我是使用Carbon库的忠实粉丝,这使得这种事情变得非常容易。例如:

use Carbon\Carbon;

$monday = Carbon::now()->startOfWeek()
$sunday = Carbon::now()->endOfWeek()

或者,如果您希望将星期日作为一周的第一天:

use Carbon\Carbon;

Carbon::setWeekStartsAt(Carbon::SUNDAY);
Carbon::setWeekEndsAt(Carbon::SATURDAY);

$sunday = Carbon::now()->startOfWeek()
$saturday = Carbon::now()->endOfWeek()

答案 2

根据文档,格式字符串“第一天”和“最后一天”只允许几个月,而不允许在几周内使用。查看 http://www.php.net/manual/en/datetime.formats.relative.php

如果您将第一天和最后一天与一周语句相结合,则结果要么会打击解析器,要么是您没有预料到的(通常是一个月的第一天或最后一天,而不是一周)。

您在Win和Linux之间看到的差异可能只是因为不同的错误报告设置。

要获取当前周的第一天和最后一天,请使用:

$date->modify('this week');
$date->modify('this week +6 days');

要获得第50周的第一天和最后一天,请使用:

$date->setISODate(2011, 50);
$date->setISODate(2011, 50, 7);

编辑:

如果要对绝对周数使用修改方法,则必须使用 http://www.php.net/manual/en/datetime.formats.compound.php 中定义的格式:

$date->modify('2011W50');
$date->modify('2011W50 +6 days');

推荐