我在这个问题上看到了一些变种,但我相信这个尚未得到回答。
我需要获取一周的开始日期和结束日期,按年份和周数选择(不是日期)
示例:
输入:
getStartAndEndDate($week, $year);
输出:
$return[0] = $firstDay;
$return[1] = $lastDay;
返回值将类似于一个数组,其中第一个条目是星期开始日期,第二个条目是结束日期。
可选:当我们处于此状态时,日期格式必须为Y-n-j
(正常日期格式,无前导零。
我已经尝试编辑几乎完成我想要的现有功能,但到目前为止我没有运气。
请提前帮助我。
答案 0 :(得分:146)
使用DateTime类:
function getStartAndEndDate($week, $year) {
$dto = new DateTime();
$dto->setISODate($year, $week);
$ret['week_start'] = $dto->format('Y-m-d');
$dto->modify('+6 days');
$ret['week_end'] = $dto->format('Y-m-d');
return $ret;
}
$week_array = getStartAndEndDate(52,2013);
print_r($week_array);
返回:
Array
(
[week_start] => 2013-12-23
[week_end] => 2013-12-29
)
说明:
较短版本(适用于> = php5.3):
function getStartAndEndDate($week, $year) {
$dto = new DateTime();
$ret['week_start'] = $dto->setISODate($year, $week)->format('Y-m-d');
$ret['week_end'] = $dto->modify('+6 days')->format('Y-m-d');
return $ret;
}
可以使用> = php5.4中的class member access on instantiation缩短。
答案 1 :(得分:40)
很多年前,我发现了这个功能:
function getStartAndEndDate($week, $year) {
$dto = new DateTime();
$dto->setISODate($year, $week);
$ret['week_start'] = $dto->format('Y-m-d');
$dto->modify('+6 days');
$ret['week_end'] = $dto->format('Y-m-d');
return $ret;
}
$week_array = getStartAndEndDate(52,2013);
print_r($week_array);
答案 2 :(得分:12)
我们可以轻松实现这一目标,而无需额外的计算,除了DateTime类固有的计算。
function getStartAndEndDate($year, $week)
{
return [
(new DateTime())->setISODate($year, $week)->format('Y-m-d'), //start date
(new DateTime())->setISODate($year, $week, 7)->format('Y-m-d') //end date
];
}
setISODate()
函数分别有三个参数:$year
,$week
和$day
,其中$day
默认为1 - 一周的第一天。因此,我们通过7来获得$week
的第7天的确切日期。
答案 3 :(得分:10)
稍微整洁的解决方案,使用“[年] W [周] [日]”strtotime格式:
function getStartAndEndDate($week, $year) {
// Adding leading zeros for weeks 1 - 9.
$date_string = $year . 'W' . sprintf('%02d', $week);
$return[0] = date('Y-n-j', strtotime($date_string));
$return[1] = date('Y-n-j', strtotime($date_string . '7'));
return $return;
}
答案 4 :(得分:3)
最短的方式:
function week_date($week, $year){
$date = new DateTime();
return "first day of the week is ".$date->setISODate($year, $week, "1")->format('Y-m-d')
."and last day of the week is ".$date->setISODate($year, $week, "7")->format('Y-m-d');
}
echo week_date(12,2014);
答案 5 :(得分:2)
这是一个老问题,但上面发布的许多答案似乎都是不正确的。 我提出了自己的解决方案:
function getStartAndEndDate($week, $year){
$dates[0] = date("Y-m-d", strtotime($year.'W'.str_pad($week, 2, 0, STR_PAD_LEFT)));
$dates[1] = date("Y-m-d", strtotime($year.'W'.str_pad($week, 2, 0, STR_PAD_LEFT).' +6 days'));
return $dates;
}
答案 6 :(得分:2)
您可以从日期开始获取星期几,就像我得到的第一天和最后一天一样
$date = date_create();
// get the first day of the week
date_isodate_set($date, 2019, 1);
//convert date format and show
echo date_format($date, 'Y-m-d') . "\n";
// get the last date of the week
date_isodate_set($date, 2019, 1, 7);
//convert date format and show
echo date_format($date, 'Y-m-d') . "\n";
输出=>
2018-12-31
2019-01-06
答案 7 :(得分:1)
首先,我们需要从那一周开始一天,因此通过了解周数并知道一周有七天我们将会这样做
$pickADay = ($weekNo-1) * 7 + 3;
这样,pickAday将是我们所需的一周中的一天。
现在因为我们知道这一年我们可以检查哪一天。
如果我们只需要比unix时间戳更新的日期,那么事情很简单
我们将获得一年中第一天的unix时间戳并添加到24*3600*$pickADay
,这一切都很简单,因为我们有时间戳,我们可以知道它是星期几,并计算头部和尾部相应的那一周。
如果我们想要找出1848年第12周的相同内容,我们必须使用另一种方法,因为我们无法获得时间戳。知道每一年的每一天都会提前1个工作日的意思(去年11月1日是星期日,今年是星期一,闰年的例外是2天我相信,你可以检查一下)。如果年份大于1970年,我会做什么,而不是在它和需要的年份之间做出差异,知道有多少年,计算星期几,因为我的pickADay是1970年的一部分,每个工作日返回一个。 $shiftTimes = ($yearDifference + $numberOfLeapYears)%7
,区别于此。转移一天的后退词$ shiftTimes,那么你就会知道那几年的那一天是哪一天,然后找到周末和周尾。如果它看起来更简单,也可以用于未来。尝试它,如果它的工作,并告诉我,如果它没有。
答案 8 :(得分:1)
Roham Rafii的计算是错误的。这是一个简短的解决方案:
// week number to timestamp (first day of week number)
function wn2ts($week, $year) {
return strtotime(sprintf('%dW%02d', $year, $week));
}
如果您想要一周中的最后一天,可以加6 * 24 * 3600
答案 9 :(得分:1)
有关文档(由于Google在搜索“ php datetime start this week end”时将其排在首位)。
如果您需要当前星期的开始日期和结束日期(使用DateTime):
$dateTime = new DateTime('now');
$monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week');
$sunday = clone $dateTime->modify('Sunday this week');
var_dump($monday->format('Y-m-d')); // e.g. 2018-06-25
var_dump($sunday->format('Y-m-d')); // e.g. 2018-07-01
希望这会有所帮助。
答案 10 :(得分:0)
你试过PHP relative dates吗?它可能会奏效。
答案 11 :(得分:0)
即使您不想使用特定日期,也无法逃避它。您只能根据日期计算一周。
步骤:
答案 12 :(得分:0)
if(Request::is('/')) {
class="index"
}
将打印
$dateParam = '2018-06-10';
$week = date('w', strtotime($dateParam));
$date = new DateTime($dateParam);
$firstWeek = $date->modify("-".$week." day")->format("Y-m-d H:i:s");
$endWeek = $date->modify("+6 day")->format("Y-m-d H:i:s");
echo $firstWeek."<br/>";
echo $endWeek;
希望会有所帮助
答案 13 :(得分:0)
“一周的第一天”是主观的。一些文化使用“星期一”,其他文化使用“星期日”,也许其他使用其他语言?
出于我的目的,我希望一周的第一天为“周日”,一周的最后一天为“周六”。
此外,不使用任何参数的DateTime
将默认为“现在”,其中包括当前时间。下面的方法通过在DateTime构造函数中指定“今天”来忽略当前时间。
此外,字符串“本周的星期日”似乎并不可靠。实际上,它将在下周的星期日返回(根据我对一周的看法)。
我建立了一个方法,该方法返回一个包含两个DateTime对象的PHP对象。一个用于给定星期的第一天(星期日),第二个用于给定星期的最后一天(星期六)。
function get_first_and_last_day_of_week( $year_number, $week_number ) {
// we need to specify 'today' otherwise datetime constructor uses 'now' which includes current time
$today = new DateTime( 'today' );
return (object) [
'first_day' => clone $today->setISODate( $year_number, $week_number, 0 ),
'last_day' => clone $today->setISODate( $year_number, $week_number, 6 )
];
}
答案 14 :(得分:-1)
function getStartAndEndDate($week, $year)
{
$week_start = new DateTime();
$week_start->setISODate($year,$week);
$return[0] = $week_start->format('d-M-Y');
$time = strtotime($return[0], time());
$time += 6*24*3600;
$return[1] = date('d-M-Y', $time);
return $return;
}