Php 两次约会之间的两周
嗨,如何找到两个日期之间的星期数和每个星期一的日期。从2009年7月10日到今天 注意:考虑闰年和其他与日期相关的约束条件Php 两次约会之间的两周,php,date,Php,Date,嗨,如何找到两个日期之间的星期数和每个星期一的日期。从2009年7月10日到今天 注意:考虑闰年和其他与日期相关的约束条件 echo datediff('ww', '9 July 2003', '4 March 2004', false); 在以下网站上找到该功能: 更新 链接现在已断开(2017年9月),因此从webarchive中提取以下功能: <?php /** * @param $interval * @param $datefrom * @param $dateto
echo datediff('ww', '9 July 2003', '4 March 2004', false);
在以下网站上找到该功能:
更新
链接现在已断开(2017年9月),因此从webarchive中提取以下功能:
<?php
/**
* @param $interval
* @param $datefrom
* @param $dateto
* @param bool $using_timestamps
* @return false|float|int|string
*/
function datediff($interval, $datefrom, $dateto, $using_timestamps = false)
{
/*
$interval can be:
yyyy - Number of full years
q - Number of full quarters
m - Number of full months
y - Difference between day numbers
(eg 1st Jan 2004 is "1", the first day. 2nd Feb 2003 is "33". The datediff is "-32".)
d - Number of full days
w - Number of full weekdays
ww - Number of full weeks
h - Number of full hours
n - Number of full minutes
s - Number of full seconds (default)
*/
if (!$using_timestamps) {
$datefrom = strtotime($datefrom, 0);
$dateto = strtotime($dateto, 0);
}
$difference = $dateto - $datefrom; // Difference in seconds
$months_difference = 0;
switch ($interval) {
case 'yyyy': // Number of full years
$years_difference = floor($difference / 31536000);
if (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom), date("j", $datefrom), date("Y", $datefrom)+$years_difference) > $dateto) {
$years_difference--;
}
if (mktime(date("H", $dateto), date("i", $dateto), date("s", $dateto), date("n", $dateto), date("j", $dateto), date("Y", $dateto)-($years_difference+1)) > $datefrom) {
$years_difference++;
}
$datediff = $years_difference;
break;
case "q": // Number of full quarters
$quarters_difference = floor($difference / 8035200);
while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($quarters_difference*3), date("j", $dateto), date("Y", $datefrom)) < $dateto) {
$months_difference++;
}
$quarters_difference--;
$datediff = $quarters_difference;
break;
case "m": // Number of full months
$months_difference = floor($difference / 2678400);
while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($months_difference), date("j", $dateto), date("Y", $datefrom)) < $dateto) {
$months_difference++;
}
$months_difference--;
$datediff = $months_difference;
break;
case 'y': // Difference between day numbers
$datediff = date("z", $dateto) - date("z", $datefrom);
break;
case "d": // Number of full days
$datediff = floor($difference / 86400);
break;
case "w": // Number of full weekdays
$days_difference = floor($difference / 86400);
$weeks_difference = floor($days_difference / 7); // Complete weeks
$first_day = date("w", $datefrom);
$days_remainder = floor($days_difference % 7);
$odd_days = $first_day + $days_remainder; // Do we have a Saturday or Sunday in the remainder?
if ($odd_days > 7) { // Sunday
$days_remainder--;
}
if ($odd_days > 6) { // Saturday
$days_remainder--;
}
$datediff = ($weeks_difference * 5) + $days_remainder;
break;
case "ww": // Number of full weeks
$datediff = floor($difference / 604800);
break;
case "h": // Number of full hours
$datediff = floor($difference / 3600);
break;
case "n": // Number of full minutes
$datediff = floor($difference / 60);
break;
default: // Number of full seconds (default)
$datediff = $difference;
break;
}
return $datediff;
}
以下函数计算两个时间戳之间的“口语周”(即,如果您在周六,则周一为下周)
以下是使用DateTime的替代解决方案:-
function datediffInWeeks($date1, $date2)
{
if($date1 > $date2) return datediffInWeeks($date2, $date1);
$first = DateTime::createFromFormat('m/d/Y', $date1);
$second = DateTime::createFromFormat('m/d/Y', $date2);
return floor($first->diff($second)->days/7);
}
var_dump(datediffInWeeks('1/2/2013', '6/4/2013'));// 21
PHP中两个日期之间的所有周数
getNoOfWeek()将返回带有年份的周号数组。您可以从week_text_alter()更改此数组的格式
函数getNoOfWeek($startDate,$endDate){
//将日期转换为有效格式
$startDate=日期(“Y-m-d”,标准时间($startDate));
$endDate=日期(“Y-m-d”,标准时间($endDate));
$yearEndDay=31;
$weekArr=array();
$startYear=日期(“Y”,标准时间($startDate));
$endYear=日期(“Y”,标准时间($endDate));
如果($startYear!=$endYear){
$newStartDate=$startDate;
对于($i=$startYear;$i'Week','post'=>“'.”。substr($i,2,2));
$weekArr=array\u merge($weekArr,$tempWeekArr);
$newStartDate=日期(“Y-m-d”,标准时间($newEndDate.+1天”);
}
}否则{
$startWeek=日期(“W”,标准时间($startDate));
$endWeek=日期(“W”,标准时间($endDate));
$endWeekMonth=日期(“m”,标准时间($endDate));
如果($endWeek==1&&$endWeekMonth==12){
$endWeek=日期(“W”,标准时间($endYear.-12-”($yearEndDay-7));
}
$weekArr=范围($startWeek,$endWeek);
数组\u walk($weekar,“week\u text\u alter”,
数组('pre'=>'Week','post'=>“'.”。substr($startYear,2,2));
}
$weekArr=数组填充键($weekArr,0);
返回$weekar;
}
函数周\文本\更改(&$item1,$key,$prefix)
{
$item1=$prefix['pre'].$item1.$prefix['post'];
}
产出1-
$weekArr=getNoOfWeek('2014-01-01','2014-02-10');
排列
(
[第1周'14]=>0
[第2周'14]=>0
[第3周'14]=>0
[第4周'14]=>0
[第5周'14]=>0
[第6周'14]=>0
[第7周'14]=>0
)
产出2-
$weekArr=getNoOfWeek('2013-12-01','2014-02-10');
排列
(
[第48周'13]=>0
[第49周'13]=>0
[第50周'13]=>0
[第51周'13]=>0
[第52周'13]=>0
[第1周'14]=>0
[第2周'14]=>0
[第3周'14]=>0
[第4周'14]=>0
[第5周'14]=>0
[第6周'14]=>0
[第7周'14]=>0
)
希望这将对您有所帮助。PHP两个日期之间的周数问题
下面是找出日期范围之间的周数的解决方案(文章中提出的一个问题的更正解决方案)
由于下面的解决方案使用了日期差,因此,对于开始日期周,必须使用floor函数,对于结束日期周,必须使用ceil,然后仅返回正确的周数
$strtDate = '2014-01-01';
$endDate = '2015-03-17';
$startDateWeekCnt = round(floor( date('d',strtotime($strtDate)) / 7)) ;
// echo $startDateWeekCnt ."\n";
$endDateWeekCnt = round(ceil( date('d',strtotime($endDate)) / 7)) ;
//echo $endDateWeekCnt. "\n";
$datediff = strtotime(date('Y-m',strtotime($endDate))."-01") - strtotime(date('Y-m',strtotime($strtDate))."-01");
$totalnoOfWeek = round(floor($datediff/(60*60*24)) / 7) + $endDateWeekCnt - $startDateWeekCnt ;
echo $totalnoOfWeek ."\n";
这工作很棒
function weeks_between($datefrom, $dateto)
{
$datefrom = DateTime::createFromFormat('d/m/Y H:i:s',$datefrom);
$dateto = DateTime::createFromFormat('d/m/Y H:i:s',$dateto);
$interval = $datefrom->diff($dateto);
$week_total = $interval->format('%a')/7;
return floor($week_total);
}
weeks_between("25/02/2000 11:30:00","05/06/2015 11:29:59")
我从上面更新了Tom的代码,使函数自动检测字符串或int日期/时间
<?php
/**
* @param $interval
* @param $datefrom
* @param $dateto
* @param bool $using_timestamps // Removed 08-29-2019 Jay Simons - Now auto-detects
* @return false|float|int|string
*/
function datediff($interval, $datefrom, $dateto)
{
/*
$interval can be:
yyyy - Number of full years
q - Number of full quarters
m - Number of full months
y - Difference between day numbers
(eg 1st Jan 2004 is "1", the first day. 2nd Feb 2003 is "33". The datediff is "-32".)
d - Number of full days
w - Number of full weekdays
ww - Number of full weeks
h - Number of full hours
n - Number of full minutes
s - Number of full seconds (default)
*/
/*Remove
if (!$using_timestamps) {
$datefrom = strtotime($datefrom, 0);
$dateto = strtotime($dateto, 0);
}
*/
// Auto-detect string date or int date:
$dateto_str = strtotime($dateto);
$datefrom_str = strtotime($datefrom);
if ($dateto_str) $dateto = $dateto_str;
if ($datefrom_str) $datefrom = $datefrom_str;
$difference = $dateto - $datefrom; // Difference in seconds
$months_difference = 0;
switch ($interval) {
case 'yyyy': // Number of full years
$years_difference = floor($difference / 31536000);
if (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom), date("j", $datefrom), date("Y", $datefrom)+$years_difference) > $dateto) {
$years_difference--;
}
if (mktime(date("H", $dateto), date("i", $dateto), date("s", $dateto), date("n", $dateto), date("j", $dateto), date("Y", $dateto)-($years_difference+1)) > $datefrom) {
$years_difference++;
}
$datediff = $years_difference;
break;
case "q": // Number of full quarters
$quarters_difference = floor($difference / 8035200);
while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($quarters_difference*3), date("j", $dateto), date("Y", $datefrom)) < $dateto) {
$months_difference++;
}
$quarters_difference--;
$datediff = $quarters_difference;
break;
case "m": // Number of full months
$months_difference = floor($difference / 2678400);
while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($months_difference), date("j", $dateto), date("Y", $datefrom)) < $dateto) {
$months_difference++;
}
$months_difference--;
$datediff = $months_difference;
break;
case 'y': // Difference between day numbers
$datediff = date("z", $dateto) - date("z", $datefrom);
break;
case "d": // Number of full days
$datediff = floor($difference / 86400);
break;
case "w": // Number of full weekdays
$days_difference = floor($difference / 86400);
$weeks_difference = floor($days_difference / 7); // Complete weeks
$first_day = date("w", $datefrom);
$days_remainder = floor($days_difference % 7);
$odd_days = $first_day + $days_remainder; // Do we have a Saturday or Sunday in the remainder?
if ($odd_days > 7) { // Sunday
$days_remainder--;
}
if ($odd_days > 6) { // Saturday
$days_remainder--;
}
$datediff = ($weeks_difference * 5) + $days_remainder;
break;
case "ww": // Number of full weeks
$datediff = floor($difference / 604800);
break;
case "h": // Number of full hours
$datediff = floor($difference / 3600);
break;
case "n": // Number of full minutes
$datediff = floor($difference / 60);
break;
default: // Number of full seconds (default)
$datediff = $difference;
break;
}
return $datediff;
}
?>
如果您选择一周中的星期日和另一周中的星期一,则将一天计为一周。虽然只有2天,但不同的周数,因此将计算2周。
也适用于不同的年份
函数返回\u周($datee){
$duedt=爆炸(“-”,$datee);
$date=mktime(0,0,0,$duedt[1],$duedt[2],$duedt[0]);
$week=(int)日期('W',$date);
返回$week;
}
函数周_介于($strtDate,$endDate){
//输入格式为yyyy-mm-dd的日期,您希望在该日期之间获得周数
$start\u date=DateTime::createFromFormat(“Y-m-d,$strtDate”);
$end_date=DateTime::createFromFormat(“Y-m-d”,$endDate);
$start_year=$start_date->格式(“Y”);
$end_year=$end_date->format(“Y”);
$start_MOUNT=$start_date->格式(“m”);
$end_month=$end_date->format(“m”);
$week1=返回周($strtDate);
$week2=返回周($endDate);
$diff=$end_year-$start_year;;
如果($end\u month$formt\u start\u date=新日期时间($start\u date));
$formt_end_date=新日期时间($end_date);
对于($i=$formt\u开始日期;$i<$formt\u结束日期;$i->修改(“+7天”){
$week_frequency[]=新日期时间($i->格式(“Y-m-d”);
}
日期的格式是什么?事实上,格式并不重要,因为它将被转换为unix时间戳。如果不是因为2012年(以及2016年、2020年和2024年)等许多范围内的一个不太微妙的错误,那就好了:2月29日。如果您包含datediff
的代码,那就太好了,以防链接无效。我怎么能在谷歌上搜索一个函数来查找两个日期在几周内的差异,并最终导致StackOverflow…阅读一条链接到我自己的网站的评论和我为解决此问题而编写的代码?我想我很抱歉失去它…@Piskvor声称对于这样一个复杂的函数,你应该有一些可复制的代码,它工作得很好,我没有看到任何错误it@DaveChild发现此函数在两个日期之间计算周数,您看到了吗?DST有问题。可能的解决方案:在UTC工作,使用轮换代替轮换,或使用DateTime::diff而不是减法。什么是DST@Brilliand?@Radmation夏令时我认为这个答案比公认的更完整,特别是如果@Piskvor说datediff有bug是正确的话。这里的地板--floor($first->diff($second)->days/7)正在给我带来问题…所以这可能是您的程序需要将2.8周视为3周还是2周的问题。@Aukhan然后可以随意修改它以适应:)这里发布的代码片段不可能适合所有场景,它们只是建议的起点。也许会更适合你?@vascowhite…耶:)那天我确实修改了它
$strtDate = '2014-01-01';
$endDate = '2015-03-17';
$startDateWeekCnt = round(floor( date('d',strtotime($strtDate)) / 7)) ;
// echo $startDateWeekCnt ."\n";
$endDateWeekCnt = round(ceil( date('d',strtotime($endDate)) / 7)) ;
//echo $endDateWeekCnt. "\n";
$datediff = strtotime(date('Y-m',strtotime($endDate))."-01") - strtotime(date('Y-m',strtotime($strtDate))."-01");
$totalnoOfWeek = round(floor($datediff/(60*60*24)) / 7) + $endDateWeekCnt - $startDateWeekCnt ;
echo $totalnoOfWeek ."\n";
function weeks_between($datefrom, $dateto)
{
$datefrom = DateTime::createFromFormat('d/m/Y H:i:s',$datefrom);
$dateto = DateTime::createFromFormat('d/m/Y H:i:s',$dateto);
$interval = $datefrom->diff($dateto);
$week_total = $interval->format('%a')/7;
return floor($week_total);
}
weeks_between("25/02/2000 11:30:00","05/06/2015 11:29:59")
<?php
/**
* @param $interval
* @param $datefrom
* @param $dateto
* @param bool $using_timestamps // Removed 08-29-2019 Jay Simons - Now auto-detects
* @return false|float|int|string
*/
function datediff($interval, $datefrom, $dateto)
{
/*
$interval can be:
yyyy - Number of full years
q - Number of full quarters
m - Number of full months
y - Difference between day numbers
(eg 1st Jan 2004 is "1", the first day. 2nd Feb 2003 is "33". The datediff is "-32".)
d - Number of full days
w - Number of full weekdays
ww - Number of full weeks
h - Number of full hours
n - Number of full minutes
s - Number of full seconds (default)
*/
/*Remove
if (!$using_timestamps) {
$datefrom = strtotime($datefrom, 0);
$dateto = strtotime($dateto, 0);
}
*/
// Auto-detect string date or int date:
$dateto_str = strtotime($dateto);
$datefrom_str = strtotime($datefrom);
if ($dateto_str) $dateto = $dateto_str;
if ($datefrom_str) $datefrom = $datefrom_str;
$difference = $dateto - $datefrom; // Difference in seconds
$months_difference = 0;
switch ($interval) {
case 'yyyy': // Number of full years
$years_difference = floor($difference / 31536000);
if (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom), date("j", $datefrom), date("Y", $datefrom)+$years_difference) > $dateto) {
$years_difference--;
}
if (mktime(date("H", $dateto), date("i", $dateto), date("s", $dateto), date("n", $dateto), date("j", $dateto), date("Y", $dateto)-($years_difference+1)) > $datefrom) {
$years_difference++;
}
$datediff = $years_difference;
break;
case "q": // Number of full quarters
$quarters_difference = floor($difference / 8035200);
while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($quarters_difference*3), date("j", $dateto), date("Y", $datefrom)) < $dateto) {
$months_difference++;
}
$quarters_difference--;
$datediff = $quarters_difference;
break;
case "m": // Number of full months
$months_difference = floor($difference / 2678400);
while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($months_difference), date("j", $dateto), date("Y", $datefrom)) < $dateto) {
$months_difference++;
}
$months_difference--;
$datediff = $months_difference;
break;
case 'y': // Difference between day numbers
$datediff = date("z", $dateto) - date("z", $datefrom);
break;
case "d": // Number of full days
$datediff = floor($difference / 86400);
break;
case "w": // Number of full weekdays
$days_difference = floor($difference / 86400);
$weeks_difference = floor($days_difference / 7); // Complete weeks
$first_day = date("w", $datefrom);
$days_remainder = floor($days_difference % 7);
$odd_days = $first_day + $days_remainder; // Do we have a Saturday or Sunday in the remainder?
if ($odd_days > 7) { // Sunday
$days_remainder--;
}
if ($odd_days > 6) { // Saturday
$days_remainder--;
}
$datediff = ($weeks_difference * 5) + $days_remainder;
break;
case "ww": // Number of full weeks
$datediff = floor($difference / 604800);
break;
case "h": // Number of full hours
$datediff = floor($difference / 3600);
break;
case "n": // Number of full minutes
$datediff = floor($difference / 60);
break;
default: // Number of full seconds (default)
$datediff = $difference;
break;
}
return $datediff;
}
?>
This will count a single day as one week and if you select sunday of one week and monday of another. though only 2 days are there but of different weeks therefore 2 weeks will be counted.
Also works for different years
function return_week($datee){
$duedt = explode("-", $datee);
$date = mktime(0, 0, 0, $duedt[1], $duedt[2], $duedt[0]);
$week = (int)date('W', $date);
return $week ;
}
function weeks_between($strtDate, $endDate){
// input dates of format yyyy-mm-dd between which you want to get number of weeks
$start_date = DateTime::createFromFormat("Y-m-d", $strtDate);
$end_date = DateTime::createFromFormat("Y-m-d", $endDate);
$start_year = $start_date->format("Y");
$end_year = $end_date->format("Y");
$start_month = $start_date->format("m");
$end_month = $end_date->format("m");
$week1 = return_week($strtDate);
$week2 = return_week($endDate);
$diff = $end_year - $start_year;;
if($end_month<$start_month && $start_year!=$end_year ){
$week_diff = (52*$diff-$week1)+$week2+1;
return ($start_year==$end_year)?$week_diff:abs($week_diff);
}else{
$week_diff = $week2-$week1+1;
return ($start_year==$end_year)?$week_diff:abs($week_diff)+52*$diff;
}
}
//call to function
weeks_between(""2018-10-21,"2019-10-21");
$formt_start_date = new DateTime($start_date);
$formt_end_date = new DateTime($end_date);
for ($i = $formt_start_date; $i < $formt_end_date; $i->modify('+7 day')) {
$week_frequency[] = new DateTime($i->format("Y-m-d"));
}