如何找到两个日期之间的周一或周二的数量?

我有开始日期和结束日期。

我需要找出的那一天是星期天或星期一等依赖于复选框用户点击。

我怎样才能找到/计算出在PHP?

--------------解决方案-------------

可以创建使用的strtotime()递归来计算天数的函数。 由于strtotime("next monday");工作得很好。

function daycount($day, $startdate, $counter)
{
if($startdate >= time())
{
return $counter;
}
else
{
return daycount($day, strtotime("next ".$day, $startdate), ++$counter);
}
}

echo daycount("monday", strtotime("01.01.2009"), 0);

希望这是你要找的东西:)

没有循环,没有递归

<?php
define('ONE_WEEK', 604800); // 7 * 24 * 60 * 60

function number_of_days($days, $start, $end) {
$w = array(date('w', $start), date('w', $end));
$x = floor(($end-$start)/ONE_WEEK);
$sum = 0;

for ($day = 0;$day < 7;++$day) {
if ($days & pow(2, $day)) {
$sum += $x + ($w[0] > $w[1]?$w[0] <= $day || $day <= $w[1] : $w[0] <= $day && $day <= $w[1]);
}
}

return $sum;
}

//$start = $end = time();

// 0x10 == pow(2, 4) == 1 << 4 // THURSDAY
// 0x20 == pow(2, 5) == 1 << 5 // FRIDAY
echo number_of_days(0x01, $start, $end); // SUNDAY
echo number_of_days(pow(2, 0), $start, $end); // SUNDAY
echo number_of_days(0x02, $start, $end); // MONDAY
echo number_of_days(pow(2, 1), $start, $end); // MONDAY
echo number_of_days(0x04, $start, $end); // TUESDAY
echo number_of_days(1 << 2, $start, $end); // TUESDAY
echo number_of_days(0x08, $start, $end); // WEDNESDAY
echo number_of_days(1 << 3, $start, $end); // WEDNESDAY
echo number_of_days(0x10, $start, $end); // THURSDAY
echo number_of_days(0x20, $start, $end); // FRIDAY
echo number_of_days(0x40, $start, $end); // SATURDAY
echo number_of_days(0x01 | 0x40, $start, $end); // WEEKENDS : SUNDAY | SATURDAY
echo number_of_days(0x3E, $start, $end); // WORKDAYS : MONDAY | TUESDAY | WEDNESDAY | THURSDAY | FRIDAY
?>

通过w35I3y答案几乎是正确的,但我是用这个函数得到错误。 该函数正确地计算周一的数量或两个给定日期之间的任何特定的一天:

/**
* Counts the number occurrences of a certain day of the week between a start and end date
* The $start and $end variables must be in UTC format or you will get the wrong number
* of days when crossing daylight savings time
* @param - $day - the day of the week such as "Monday", "Tuesday"...
* @param - $start - a UTC timestamp representing the start date
* @param - $end - a UTC timestamp representing the end date
* @return Number of occurences of $day between $start and $end
*/
function countDays($day, $start, $end)
{
//get the day of the week for start and end dates (0-6)
$w = array(date('w', $start), date('w', $end));

//get partial week day count
if ($w[0] < $w[1])
{
$partialWeekCount = ($day >= $w[0] && $day <= $w[1]);
}else if ($w[0] == $w[1])
{
$partialWeekCount = $w[0] == $day;
}else
{
$partialWeekCount = ($day >= $w[0] || $day <= $w[1]);
}

//first count the number of complete weeks, then add 1 if $day falls in a partial week.
return floor( ( $end-$start )/60/60/24/7) + $partialWeekCount;
}

用法示例:

$start = strtotime("tuesday UTC");
$end = strtotime("3 tuesday UTC");
echo date("m/d/Y", $start). " - ".date("m/d/Y", $end). " has ". countDays(0, $start, $end). " Sundays";

输出是这样的:09/28/2010 - 10/19/2010有3个星期日。

<?php
$date = strtotime('2009-01-01');
$dateMax = strtotime('2009-02-23');

$nbr = 0;
while ($date < $dateMax) {
var_dump(date('Ym-d', $date));
$nbr++;
$date += 7 * 24 * 3600;
}
echo "<pre>";
var_dump($nbr);
?>

这个问题仅仅是迫切需要使用PHP的日期时间类更新的答案,所以在这里它是: -

/**
* @param String $dayName eg 'Mon', 'Tue' etc
* @param DateTime $start
* @param DateTime $end
* @return int
*/
function countDaysByName($dayName, \DateTime $start, \DateTime $end)
{
$count = 0;
$interval = new \DateInterval('P1D');
$period = new \DatePeriod($start, $interval, $end);

foreach($period as $day){
if($day->format('D') === ucfirst(substr($dayName, 0, 3))){
$count ++;
}
}
return $count;
}

我对周日工作而已。不过我不知道如何使它另一天answer.Its

// Define a constant of 1 day in seconds

定义(ONE_DAY,86400); date_default_timezone_set(“美国/纽约');

// Accepts two timestamps, start and end
// Returns an array of timestamps that fall on a sunday
function sundays_in_range($start, $end) {
echo date('N', $start);
echo "<br/>";
$days_until_sunday = date('w', $start) > 0 ? 7 - date('w', $start) : 0;

$date = $start + (ONE_DAY * $days_until_sunday);
$sundays = array();
while ($date <= $end) {
array_push($sundays, $date);
$date += (7 * ONE_DAY);
}
return $sundays;
}

// Calculate some example dates. Today, and 30 days from now
$start = time($start);
$end = time($end) + (30 * ONE_DAY);
echo ONE_DAY;
echo "<br/>";
$count=0;
// Loop and output Ymd
foreach (sundays_in_range($start, $end) as $sunday)
{
print "<option>".date("Ymd", $sunday)."</option><br/>";
$count++;
}

echo $count;

?>

function daycount($day, $startdate, $enddate, $counter) {
if($startdate >= $enddate) {
return $counter-1; // A hack to make this function return the correct number of days.
} else {
return $this->daycount($day, strtotime("next ".$day, $startdate), $enddate, ++$counter);
}
}

这是一个不同版本的第一个答案,它接受一个起点和终点以及对我的作品的。 所有这些网页上给出的例子似乎返回答案外加一天的某些原因。

w35l3y的答案似乎工作得很好,所以我了,投它。 不过,我更喜欢的东西有点更容易执行,并以较少的数学和循环(不知道它从性能的角度来看重要的,虽然)。 我想我涵盖所有可能的方案......这就是我想出了:

function numDays($sday, $eday, $i, $cnt) {
if (($sday < $eday && $i >= $sday && $i <= $eday) || ($sday > $eday && ($i >= $sday || $i <= $eday))) {
// partial week (implied by $sday != $eday), so $i (day iteration) may have occurred one more time
// a) end day is ahead of start day; $i is within start/end of week range
// b) start day is ahead of end day (ie, Tue start, Sun end); $i is either in back half of first week or front half of second week
$cnt++;
} elseif ($sday == $eday && $i == $sday) {
// start day and end day are the same, and $i is that day, ie, Tue occurs twice from Tue-Tue (1 wk, so $wks = $cnt)
$cnt++;
}

return $cnt; // # of complete weeks + partial week, if applicable
}

备注:$ SDAY和$伊戴是对应于开始和范围的端部的天数进行检查,并且$ i是天数被计数(Ⅰ有它在一个0-6环)。 我搬到$周之外的功能,因为没有点每次都重新计算它。

$wks = floor(($endstamp - $startstamp)/7*24*60*60);
$numDays = numDays($sday, $eday, $i, $wks);

请确保您比较的开始/结束时间戳具有相同的时区调整,如果有的话,否则你将永远是掀起了位,且$ CNT和$周。 (我是从一个未调整的第一年计算,以调整后的日期/时间X时遇到了这一点)

要计算总周五两个日期之间##

$from_date=(2015-01-01);

$to_date=(2015-01-20);

while(strtotime($from_date) <= strtotime($to_date)){

//5 for count Friday, 6 for Saturday , 7 for Sunday

if(date("N",strtotime($from_date))==5){
$counter++;
}
$from_date = date ("Ymd", strtotime("+1 day", strtotime($from_date)));

}

echo $counter;

分类:php 时间:2012-01-01 人气:0
本文关键词: PHP,日期
分享到:

相关文章

  • 如何添加在GridView控件设计的WinForms日期选择列 2012-01-01

    我使用的WinForm C#. 在那我怎样才能GridView控件添加日期选择器列设计方法. 我可以看到按钮,复选框,链接列. 但日期时间选择器丢失. 和任何方式添加日期时间选择器无需编写代码. 如果可能的话请告诉我.... 请帮帮我,.. --------------解决方案------------- 有没有内置的选项来举办日期/时间选择器控件. 但是, DataGridView控制是非常定制,并支持托管自定义控件. 所有你需要做的是延长DataGridViewColumn类来创建一个自定义的

  • Windows 7的小工具日历不显示星期和日期 2012-01-01

    你好, 我张贴代表我的客户. 他刚刚买了一台新电脑与Windows 7和日历gadget不显示星期和日期. 它只是显示一个空白颜色框. 这怎么能解决吗? --------------解决方案------------- 点击开始按钮,然后键入在资源管理器中,还原与Windows默认安装的小工具, 这可能表明这个选项,你键入通过了小工具之前, 点击链接建议. 确保日期/时间设置. Microsoft已为直接修复:http://support.microsoft.com/kb/2515657

  • 克隆时的jquery-plugin的日期选择器不工作 2012-01-01

    我在其中的两个文本框每个块都克隆了以下代码(标记和JavaScript). 每个块包含2个文本框; 一个用普通的文本框; 另一种是文本框与关联日期选择器插件("textboxDueDate"的ID). 只有第一个/原创作品与弹出日历时,用户点击里面. 然而,克隆"textboxDueDate"文本框没有被点击里面,当他们弹出日历显示. 有什么错我的代码? <div> <input type="button" id="b

  • 转换日期:DM-YYYY为DD-MM-YYYY 2012-01-01

    可能重复: 日期转换 我从对话的日期:2012年5月1日 - 作为一个字符串. 我需要将其转换为05-01-2012,字符串为好. 什么是做到这一点的方式simpliest? --------------解决方案------------- 你的意思是? String date = "5-1-2012"; if (date.charAt(1) == '-') date = "0" + date; if (date.charAt(4) == '-') date = da

  • 特殊字符串数组排序列表,按日期 2012-01-01

    我的ArrayList. 这是一个字符串的ArrayList. 该字符串包含一个"Date.toString"在格式"January 1, 1970, 00:00:00 GMT" +任务名称. 例如: "January 1, 1970, 00:00:00 GMT clean the house". 我想排序此ArrayList按日期. 我该怎么办呢? --------------解决方案------------- 你可以写一个分析的日期,并利用它

  • 关于Java格式化日期 2012-01-01

    我有一个具有以下格式的字符串:janu​​ary_2005(MMMMMMM_yyyy) 我想将其转换为一个MySQL接受的日期值插入它在数据库上. 我需要做它的Java. 有谁知道怎么办呢? 谢谢 --------------解决方案------------- 这样的事可能会做的伎俩, SimpleDateFormat myFormat = new SimpleDateFormat("MMMM_yyyy"); Date aDate; try { aDate = myFormat.par

  • 更改日期格式 2012-01-01

    在计算器我设置一个单元格的值改为"2006年10月3号13:33:55.448"和计算器说,这是标准格式. 我这样做与Java,我想格式设置为"DD.MM.YY HH:MM:SS AM / PM": XNumberFormatTypes xFormatTypes = (XNumberFormatTypes) UnoRuntime.queryInterface(XNumberFormatTypes.class, xNumberFormats); int myDateF

  • 记录用户活动在Silverlight Web应用程序:如果用户是什么改变了他们的系统日期时间? 2012-01-01

    我有几个记录用户行为的Web应用程序. 此外,这个应用程序的更重要的一个方面使用Telerik的计划程序组件来计划访问应用程序的其它区域. 这可以通过更改您的Windows设置日期时间或时区很容易被欺骗. 有没有人对确保用户对我们也不能"瞒过"任何提示? --------------解决方案------------- 你可以抓住从服务器当前系统时间在应用程序启动和它比较当前客户端的时间和存储的差异. 然后,当你需要一个时间值,使用由差额调整客户端的时间. 如果用户很可能要调整他们的系统

  • 如何确定的DataColumn的类型是数字,字符串或日期时间? 2012-01-01

    我需要根据DataColumns的一个DataTable的类型格式输出. 具体而言,我需要映射内置基本类型(int,字符串,小数,日期时间等),以: SomeEnum.Numeric SomeEnum.Bool SomeEnum.DateTime SomeEnum.String SomeEnum.Unknown SomeEnum.Null 我怎么能这样做? --------------解决方案------------- 如果内置TypeCode枚举满足您的需求,那么你可以只读取DataType的

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.296 (s). 10 q(s)