Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从日期获取周数(以年为单位)_Php_Date_Mktime - Fatal编程技术网

Php 从日期获取周数(以年为单位)

Php 从日期获取周数(以年为单位),php,date,mktime,Php,Date,Mktime,我想确定一个日期并计算出它的周数 到目前为止,我有以下几点。当它应该是42时,它返回24 <?php $ddate = "2012-10-18"; $duedt = explode("-",$ddate); $date = mktime(0, 0, 0, $duedt[2], $duedt[1],$duedt[0]); $week = (int)date('W', $date); echo "Weeknummer: ".$week; ?> 数字颠倒是错误的还是巧合?还是我就快到

我想确定一个日期并计算出它的周数

到目前为止,我有以下几点。当它应该是42时,它返回24

<?php
$ddate = "2012-10-18";
$duedt = explode("-",$ddate);
$date = mktime(0, 0, 0, $duedt[2], $duedt[1],$duedt[0]);
$week = (int)date('W', $date);
echo "Weeknummer: ".$week;
?>


数字颠倒是错误的还是巧合?还是我就快到了?

规则是,一年中的第一周是包含一年中第一个星期四的一周

我个人使用Zend_Date进行这种计算,得到今天的一周就这么简单。如果你使用日期,它们还有很多其他有用的功能

$now = Zend_Date::now();
$week = $now->get(Zend_Date::WEEK);
// 10

您的代码可以工作,但需要翻转第4个和第5个参数

我会这样做的

$date_string = "2012-10-18";
$date_int = strtotime($date_string);
$date_date = date($date_int);
$week_number = date('W', $date_date);
echo "Weeknumber: {$week_number}.";

同样,你的变量名会让你困惑,一个星期不看代码,你应该考虑阅读

使用PHP的日期函数



您对mktime的参数有误-需要是月/日/年,而不是日/月/年

今天,使用PHP的对象更好:

<?php
$ddate = "2012-10-18";
$date = new DateTime($ddate);
$week = $date->format("W");
echo "Weeknummer: $week";
因此,您的订单是错误的

<?php
$ddate = "2012-10-18";
$duedt = explode("-", $ddate);
$date  = mktime(0, 0, 0, $duedt[1], $duedt[2], $duedt[0]);
$week  = (int)date('W', $date);
echo "Weeknummer: " . $week;
?>

此“今日获取”日期,然后告知本周的周数

<?php
 $date=date("W");
 echo $date." Week Number";
 ?>

建议如下:

<?php echo date("W", strtotime("2012-10-18")); ?>

可能比所有这些都简单一点

您可以做的其他事情:

<?php echo date("Weeknumber: W", strtotime("2012-10-18 01:00:00")); ?>
<?php echo date("Weeknumber: W", strtotime($MY_DATE)); ?>

试试这个解决方案

date( 'W', strtotime( "2017-01-01 + 1 day" ) );

我已经尝试解决这个问题好几年了,我想我找到了一个较短的解决方案,但又不得不回到长话短说上来。此函数返回正确的ISO周表示法:

/**
 * calcweek("2018-12-31") => 1901
 * This function calculates the production weeknumber according to the start on 
 * monday and with at least 4 days in the new year. Given that the $date has
 * the following format Y-m-d then the outcome is and integer.
 *
 * @author M.S.B. Bachus
 *
 * @param date-notation PHP "Y-m-d" showing the data as yyyy-mm-dd
 * @return integer
 **/
function calcweek($date) {
  // 1. Convert input to $year, $month, $day
  $dateset      = strtotime($date);
  $year         = date("Y", $dateset);
  $month        = date("m", $dateset);
  $day          = date("d", $dateset);

  $referenceday = getdate(mktime(0,0,0, $month, $day, $year));
  $jan1day      = getdate(mktime(0,0,0,1,1,$referenceday[year]));

  // 2. check if $year is a  leapyear
  if ( ($year%4==0 && $year%100!=0) || $year%400==0) {
    $leapyear = true;
  } else {
    $leapyear = false;
  }

  // 3. check if $year-1 is a  leapyear
  if ( (($year-1)%4==0 && ($year-1)%100!=0) || ($year-1)%400==0 ) {
    $leapyearprev = true;
  } else {
    $leapyearprev = false;
  }

  // 4. find the dayofyearnumber for y m d
  $mnth = array(0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334);
  $dayofyearnumber = $day + $mnth[$month-1];
  if ( $leapyear && $month > 2 ) { $dayofyearnumber++; }

  // 5. find the jan1weekday for y (monday=1, sunday=7)
  $yy = ($year-1)%100;
  $c  = ($year-1) - $yy;
  $g  = $yy + intval($yy/4);
  $jan1weekday = 1+((((intval($c/100)%4)*5)+$g)%7);

  // 6. find the weekday for y m d
  $h = $dayofyearnumber + ($jan1weekday-1);
  $weekday = 1+(($h-1)%7);

  // 7. find if y m d falls in yearnumber y-1, weeknumber 52 or 53
  $foundweeknum = false;
  if ( $dayofyearnumber <= (8-$jan1weekday) && $jan1weekday > 4 ) {
    $yearnumber = $year - 1;
    if ( $jan1weekday = 5 || ( $jan1weekday = 6 && $leapyearprev )) {
      $weeknumber = 53;
    } else {
      $weeknumber = 52;
    }
    $foundweeknum = true;
  } else {
    $yearnumber = $year;
  }

  // 8. find if y m d falls in yearnumber y+1, weeknumber 1
  if ( $yearnumber == $year && !$foundweeknum) {
    if ( $leapyear ) {
      $i = 366;
    } else {
      $i = 365;
    }
    if ( ($i - $dayofyearnumber) < (4 - $weekday) ) {
      $yearnumber = $year + 1;
      $weeknumber = 1;
      $foundweeknum = true;
    }
  }

  // 9. find if y m d falls in yearnumber y, weeknumber 1 through 53
  if ( $yearnumber == $year && !$foundweeknum ) {
    $j = $dayofyearnumber + (7 - $weekday) + ($jan1weekday - 1);
    $weeknumber = intval( $j/7 );
    if ( $jan1weekday > 4 ) { $weeknumber--; }
  }

  // 10. output iso week number (YYWW)
  return ($yearnumber-2000)*100+$weeknumber;
}
/**
*calcweek(“2018-12-31”)=>1901
*此函数根据开始日期计算生产周数
*周一和新年至少4天。考虑到$date
*以下格式为Y-m-d,则结果为和整数。
*
*@作者M.S.B.巴赫斯
*
*@param日期符号PHP“Y-m-d”,显示数据为yyyy-mm-dd
*@返回整数
**/
函数calcweek($date){
//1.将输入转换为$year、$month、$day
$dateset=strottime($date);
$year=日期(“Y”,日期集为$dateset);
$month=日期(“m”,日期集为$dateset);
$day=日期(“d”,日期集为$dateset);
$referenceday=getdate(mktime(0,0,0,$month,$day,$year));
$jan1day=getdate(mktime(0,0,0,1,1,$referenceday[年]);
//2.检查$year是否为闰年
如果($year%4==0&&$year%100!=0)| |$year%400==0){
$leapyear=正确;
}否则{
$leapyear=假;
}
//3.检查$year-1是否为闰年
如果(($year-1)%4==0&($year-1)%100!=0)| |($year-1)%400==0){
$leapyearprev=真;
}否则{
$leapyearprev=假;
}
//4.为y m d找到向往的日子
$mnth=数组(0、31、59、90、120、151、181、212、243、273、304、334);
$dayOfNumber=$day+$mnth[$month-1];
如果($leapyear&&$month>2){$DayOfNumber++;}
//5.查找y的1月1日工作日(周一=1,周日=7)
$yy=($year-1)%100;
$c=($year-1)-$yy;
$g=$yy+intval($yy/4);
$Jan1工作日=1+(((国际价值($c/100)%4)*5+$g)%7);
//6.查找y m d的工作日
$h=$DayOfNumber+($jan1weekday-1);
$weekday=1+($h-1)%7);
//7.查找y m d是否在第52或53周的y-1号
$foundweeknum=false;
如果($第4天){
$year-1;
如果($jan1weekday=5 | |($jan1weekday=6&&$leapyearprev)){
$weeknumber=53;
}否则{
$weeknumber=52;
}
$foundweeknum=true;
}否则{
$number=$year;
}
//8.查找y m d是否在第1周的y+1中
如果($eargerNumber==$year&!$foundweeknum){
如果($年){
$i=366;
}否则{
$i=365;
}
if(($i-$DayOfNumber)<(4-$weekday)){
$year+1;
$weeknumber=1;
$foundweeknum=true;
}
}
//9.查找y m d是否在第1周到第53周的y号
如果($eargerNumber==$year&!$foundweeknum){
$j=$DayOfNumber+(7-$weekday)+($jan1weekday-1);
$weeknumber=intval($j/7);
如果($jan1weekday>4){$weeknumber--;}
}
//10.输出iso周数(YYWW)
报税表($2000)*100+weeknumber;
}

我发现我的简短解决方案错过了2018-12-31,因为它返回的是1801而不是1901。所以我必须输入这个长版本,这是正确的。

要获得北美约会的周数,我喜欢这样:

mktime(hour, minute, second, month, day, year);
function week_number($n)
{
    $w = date('w', $n);
    return 1 + date('z', $n + (6 - $w) * 24 * 3600) / 7;
}

$n = strtotime('2022-12-27');
printf("%s: %d\n", date('D Y-m-d', $n), week_number($n));
并获得:


Tue 2022-12-27:53

要获得2018-12-31日期的正确周数,请使用以下代码

$day_count = date('N',strtotime('2018-12-31'));
$week_count = date('W',strtotime('2018-12-31'));    


if($week_count=='01' && date('m',strtotime('2018-12-31'))==12){
    $yr_count = date('y',strtotime('2018-12-31')) + 1;
}else{
    $yr_count = date('y',strtotime('2018-12-31'));
}

要获取jalai日历中的周数,您可以使用:

$weeknumber = date("W"); //number week in year
$dayweek = date("w"); //number day in week
if ($dayweek == "6")
{
    $weeknumberint = (int)$weeknumber;
    $date2int++; 
    $weeknumber = (string)$date2int;
}

echo $date2;
结果:

15

星期六的周数变化

当一年有53周(如2020年)时,上述大多数示例都会产生问题。所以每四年你都会经历一周的不同。此代码不包括:

$thisYear = "2020";
$thisDate = "2020-04-24"; //or any other custom date
$weeknr = date("W", strtotime($thisDate)); //when you want the weeknumber of a specific week, or just enter the weeknumber yourself

$tempDatum = new DateTime();
$tempDatum->setISODate($thisYear, $weeknr);
$tempDatum_start = $tempDatum->format('Y-m-d');
$tempDatum->setISODate($thisYear, $weeknr, 7);
$tempDatum_end = $tempDatum->format('Y-m-d');

echo $tempDatum_start //will output the date of monday
echo $tempDatum_end // will output the date of sunday

使用
IntlGregorianCalendar
类怎么样

要求:开始使用
IntlGregorianCalendar
之前,请确保服务器上安装了
libicu
pecl/intl
。 因此,请在CLI上运行:

php -m
如果在
[PHP模块]
列表中看到
intl
,则可以使用
IntlGregorianCalendar

日期时间与IntlGregorianCalendar的对比
IntlGregorianCalendar
并不比
DateTime
好。但是
IntlGregorianCalendar
的好处是它将以
int
的形式为您提供周数

例如:

$dateTime = new DateTime('21-09-2020 09:00:00');
echo $dateTime->format("W"); // string '39'

$intlCalendar = IntlCalendar::fromDateTime ('21-09-2020 09:00:00');
echo $intlCalendar->get(IntlCalendar::FIELD_WEEK_OF_YEAR); // integer 39

当你需要一年又一周的时间时会变得更加困难。
试着找出2017年1月1日是哪一周。
(这是2016年第52周,从2016年12月26日星期一到2017年1月1日星期日)

经过长时间的搜索,我找到了

strftime('%G-%V',strtotime("2017-01-01"))
结果:2016-52



ISO-8601:1988给定年份的周数,从一年的第一周开始,至少有4个工作日,星期一是一周的开始。(01至53)


mysql中的等效格式是DATE_格式(日期,“%x-%v”)
周时
$thisYear = "2020";
$thisDate = "2020-04-24"; //or any other custom date
$weeknr = date("W", strtotime($thisDate)); //when you want the weeknumber of a specific week, or just enter the weeknumber yourself

$tempDatum = new DateTime();
$tempDatum->setISODate($thisYear, $weeknr);
$tempDatum_start = $tempDatum->format('Y-m-d');
$tempDatum->setISODate($thisYear, $weeknr, 7);
$tempDatum_end = $tempDatum->format('Y-m-d');

echo $tempDatum_start //will output the date of monday
echo $tempDatum_end // will output the date of sunday
php -m
$dateTime = new DateTime('21-09-2020 09:00:00');
echo $dateTime->format("W"); // string '39'

$intlCalendar = IntlCalendar::fromDateTime ('21-09-2020 09:00:00');
echo $intlCalendar->get(IntlCalendar::FIELD_WEEK_OF_YEAR); // integer 39
strftime('%G-%V',strtotime("2017-01-01"))