我需要在 php 中获取周数,其中周应从星期日开始计算。默认从周一开始。请帮助我找到一种方法,如何获取以星期日为开始日的周数。
在 PHP 手册中 ISO-8601 一年中的周数,从星期一开始的周(在 PHP 4.1.0 中添加)
但是我需要获取一年中的周数,从星期日开始的周数。
谢谢
试试这个:
$week = intval(date('W'));
if (date('w') == 0) { // 0 = Sunday
$week++;
}
echo $week;
不确定逻辑是否正确;
第一个解决方案在 2017 年 1 月 1 日或以星期日开始的任何年份都不正确。
试试这个:
$date = date('Y-m-d');
echo strftime("%U", strtotime($date ) );
扩展silkfire答案并允许它环绕数年
if($date->format('w') == 0){
if(date('W',strtotime($date->format('Y')."-12-31"))==52 and $date->format('W') == 52){
$week = 1;
}
elseif(date('W',strtotime($date->format('Y')."-12-31"))==53 and $date->format('W') == 53){
$week = 1;
}
else{
$week++;
}
}
试试这个。要获得星期日必须-1 天。
$date = "2015-05-25";
echo date("W", strtotime("-1 day",strtotime($date)));
你应该尝试使用 strftime
$week_start = new DateTime();
$week = strftime("%U"); //this gets you the week number starting Sunday
$week_start->setISODate(2012,$week,0); //return the first day of the week with offset 0
echo $week_start -> format('d-M-Y'); //and just prints with formatting
我这样解决了这个问题:
function getWeekOfYear( DateTime $date ) {
$dayOfweek = intval( $date->format('w') );
if( $dayOfweek == 0 ) {
$date->add(new DateInterval('P1D'));
}
$weekOfYear = intval( $date->format('W') );
return $weekOfYear;
}
基于@silkfire的答案:
$year = date('Y');
$week_no = date('W');
if (date('w') == 0) { // 0 = Sunday
$week_no++;
}
// We shifted the week but the week still starts on a Monday.
$weekStartDate = new DateTime();
$weekStartDate->setISODate($year,$week_no);
// Shift start date to Sunday
$weekStartDate->add(DateInterval::createFromDateString('-1 day'));
在 php 5.6 Debian 7 中测试
function getWeekNumber(\DateTime $_date)
{
$week = intval($_date->format('W'));
if(intval($_date->format('w')) == 0) {
$week = intval($_date->format('W')) == ( 52 + intval($_date->format('L')) ) ? 1 : $week + 1;
}
return $week;
}
我需要添加一天而不是减去才能得到 Alghi Fari 的答案。
$date = "2022-11-13";
echo date("W", strtotime("+1 day",strtotime($date)));
我知道这个主题很旧,但这是使用三元运算符和 strtotime() 的“+7 天”表达式来实现此目的的更短方法:
$week=date("W",strtotime(date("w")==1?"+7 day":"+0 day"));
如果 $date("w") 返回 true,则意味着今天是星期二和星期日之间的一天 (1-6),因此,我们可以返回今天星期 ('today')。
如果返回 false,则表示是星期一(0),因此,我们应该返回第二天('+1 周')。
这样我们就不需要关心一年中的最后一天或第一天,也不需要检查今年是否有 52 或 53 周。
编辑:之前的答案(以及本主题中的其他答案)不适用于今年,因为 1 月 1 日是星期一,因此,它需要是 1 周前(-1 周),不包括星期日(第 6 天)。
date("W",strtotime(date("w")?'-7 day':'+0 day'));
我认为询问 1 月 1 日是否是星期一的条件可以工作,但我还没有测试它,我稍后会回来回答
对于自定义日期,您可以使用此:
$date = strtotime('2018-04-30'); // (it is monday)
if(date("w",strtotime(date('Y',$date).'-01-01'))==1){ // if first day of year is monday
$week = strtotime(date('w',$date)?"-7 day":"+0 day",$date); // and today is sunday, sub a week
$week = date("W",$week);
}else{ // if is not monday
$week = strtotime(date('w',$date)==1?"+7 day":"+0 day",$date); // and today is monday, add a week
$week = date("W",$week);
}