这是我要写的功能:
function getWednesdays($month, $year) {
// Returns an array of DateTimes representing all Wednesdays this month.
}
有什么想法吗?谢谢 -
答案 0 :(得分:27)
使用PHP5.3
function getWednesdays($y, $m)
{
return new DatePeriod(
new DateTime("first wednesday of $y-$m"),
DateInterval::createFromDateString('next wednesday'),
new DateTime("last day of $y-$m")
);
}
用法:
foreach (getWednesdays(2010, 11) as $wednesday) {
echo $wednesday->format("l, Y-m-d\n");
}
输出:
Wednesday, 2010-11-03
Wednesday, 2010-11-10
Wednesday, 2010-11-17
Wednesday, 2010-11-24
请注意,这将排除结束日期,因此如果$y-$m
的最后一天恰好是星期三,则它不在列表中。您必须在结束日期添加一天,以包含它。要包含它,请将结束日期中的相对格式更改为
new DateTime("next month $y-$m-01")
然后将结束日期设置为下个月的第一天,
使用PHP< 5.3
function getWednesdays($y, $m)
{
$ts = strtotime("first wednesday $y-$m-01");
$end = strtotime("last wednesday $y-$m");
$wednesdays = array();
while($ts <= $end) {
$wednesdays[] = $ts;
$ts = strtotime('next wednesday', $ts);
}
return $wednesdays;
}
用法:
foreach (getWednesdays(2010, 11) as $wednesday) {
echo date("l, Y-m-d\n", $wednesday);
}
与上面相同的输出(Run on Codepad)。
请注意,由于相对格式解析器的更改,此does not work for any version prior to 5.3。如果你想在PHP 5.3+中使用它,你必须将first Wednesday $y-$m-01
更改为first Wednesday of $y-$m-01
(请注意“of”)。此外,就像在DateTime版本中一样,不包括结束日期。
进一步阅读:
答案 1 :(得分:4)
您可以尝试这样的事情:
function getWednesdays($month, $year) {
$base_date = strtotime($year . '-' . $month . '-01');
$wed = strtotime('first wed of ' . date('F Y', $base_date));
$wednesdays = array();
do {
$wednesdays[] = new DateTime(date('r', $wed));
$wed = strtotime('+7 days', $wed);
} while (date('m', $wed) == $month);
return $wednesdays;
}
答案 2 :(得分:3)
使用此功能可获得一个月内的任何天数
function getTotalDays($year, $month, $day){
$from = $year."-".$month."-01";
$t=date("t",strtotime($from));
for($i=1; $i<$t; $i++){
if( strtolower(date("l",strtotime($year."-".$month."-".$i)))== $day){
$count++;
}
}
return $count;
}
像这样使用getTotalDays(&#39; 2014&#39;,&#39; 08&#39;,&#39;星期一&#39;);
将输出4
但如果你想在特定日期的一个月内的所有日期,那么使用此功能
function getTotalDatesArray($year, $month, $day){
$date_ar=array();
$from = $year."-".$month."-01";
$t=date("t",strtotime($from));
for($i=1; $i<$t; $i++){
if( strtolower(date("l",strtotime($year."-".$month."-".$i)))== $day){
$j= $i>9 ? $i: "0".$i;
$date_ar[]=$year."-".$month."-".$j;
}
}
return $date_ar;
}
像这样使用getTotalDatesArray(&#39; 2014&#39;,&#39; 08&#39;,&#39;星期一&#39;);
将输出数组([0] =&gt; 2014-08-04 [1] =&gt; 2014-08-11 [2] =&gt; 2014-08-18 [3] =&gt; 2014-08- 25)
答案 3 :(得分:2)
可能有一种更有效的方法,但这可行:
<?php
function isWednesday($day, $month, $year)
{
if (date('w', $date = mktime(0,0,0,$month,$day,$year)) == 3) {
return $date;
}
return false;
}
function getWednesdays($month, $year)
{
for ($day=1; $day<=7; $day++) {
if ($date = isWednesday($day, $month, $year)) {
break;
}
}
$wednesdays = array();
while (date('m',$date) == $month) {
$wednesdays[] = $date;
$day += 7;
$date = isWednesday($day, $month, $year);
}
return $wednesdays;
}
你可以用这个来测试:
foreach (getWednesdays($argv[1], $argv[2]) as $date) {
echo date("Y-m-d\n", $date);
}
$ php wednesdays.php 11 2010
2010-11-03
2010-11-10
2010-11-17
2010-11-24
$ php wednesdays.php 12 2010
2010-12-01
2010-12-08
2010-12-15
2010-12-22
2010-12-29
$ php wednesdays.php 2 2012
2012-02-01
2012-02-08
2012-02-15
2012-02-22
2012-02-29
取值
答案 4 :(得分:2)
<?php
function wednesdays($month, $year)
{
list($n,$d) = explode('-', date('t-d', strtotime("Wednesday, $year-$month")));
$days = array();
while ($d <= $n)
{
$days[] = sprintf("%04d-%02d-%02d", $year, $month, $d);
$d += 7;
}
return $days;
}
var_dump(wednesdays(11, 2010));
?>
但我强烈建议您习惯使用PHP 5.3的日期和时间函数。 (见戈登的回答。)
答案 5 :(得分:1)
使用早于5.3的PHP,此解决方案不起作用。似乎,第一天时间戳大于最后一天时间戳,最终在第一次终止时终止循环。
由于PHP在午夜计算时差,因此当月份在相关日期开始时,此解决方案不起作用。并且在某些情况下,最后一天也不起作用。
我在以下代码中解决了这些问题。此代码可用于一周中的任何一天。
该解决方案是在此问题的Eli代码的帮助下创建的:Get the First or Last Friday in a Month
///// code starts here /////
function getWeekDates($year, $month, $day){
$tsInMonth = strtotime("$year-$month");
$monthNumber = (int)date("m",$tsInMonth);
$Names = array( 1=>"Sun", 2=>"Mon", 3=>"Tue", 4=>"Wed", 5=>"Thu", 6=>"Fri", 7=>"Sat" );
$ThisMonthTS = strtotime( date("Y-m-01", $tsInMonth ) );
$NextMonthTS = strtotime( date("Y-m-01", strtotime("next month", $tsInMonth) ) );
$weekDates = array();
for($Ord=1;$Ord<=5;$Ord++){
$DateOfInterest = (-1 == $Ord)
? strtotime( "last ".$Names[$day], $NextMonthTS )
: strtotime( $Names[$day]." + ".($Ord-1)." weeks", $ThisMonthTS );
($Ord==5 && (int)date("m",$DateOfInterest)==(int)date("m",$NextMonthTS))
? false
: $weekDates [] = $DateOfInterest;
}
return $weekDates;
}
///// Usage /////
foreach (getWeekDates("2010", "2", "2") as $day) {
echo "<br>" . date("l, Y-m-d", $day);
}
///// End of code /////
我希望它有所帮助。
答案 6 :(得分:1)
我已经重新编写了@ Gordon的解决方案以适应任何一天
function get_dates_of_day($y, $m, $day_name)
{
return new DatePeriod(
new DateTime("first $day_name of $y-$m"),
DateInterval::createFromDateString("next $day_name"),
new DateTime("next month $y-$m-01")
);
}
现在你可以做get_dates_of_day('2015','08','wednesday')
并使用相同的方法来获取给定月份中任何一天的日期。
答案 7 :(得分:0)
我为此目的编写了以下代码......并且它完全适合我
function get_month_date($year, $month, $day) {
$monthdays = date('t', mktime(0, 0, 0, $month, 1, $year));
$dates = array();
for($i = 0; $i <= $monthdays; $i++ ) {
if($day == date('l', mktime(0, 0, 0, $month, 1+$i, $year)) && $month == date('n', mktime(0, 0, 0, $month, 1+$i, $year))) {
$dates[] = date('Y-m-d', mktime(0, 0, 0, $month, 1+$i, $year));
}
}
return $dates; }
我们可以将它用作:
$days = get_month_date($year, $month, 'Wednesday');
它将返回给定月份和年份的星期三所有日期的数组
答案 8 :(得分:0)
以下是样本
function getSundays($y,$m){
$date = "$y-$m-01";
$first_day = date('N',strtotime($date));
$first_day = 7 - $first_day + 1;
$last_day = date('t',strtotime($date));
$days = array();
for($i=$first_day; $i<=$last_day; $i=$i+7 ){
$days[] = $i;
}
return $days;
}
$days = getSundays(2016,04);
print_r($days);
答案 9 :(得分:0)
尝试使用这个来获取当月的所有星期三。
$month = date('m');
$year = date('Y');
function getDays($year,$month){
$days = cal_days_in_month(CAL_GREGORIAN, $month,$year);
$wed = array();
for($i = 1; $i<= $days; $i++){
$day = date('Y-m-'.$i);
$result = date("D", strtotime($day));
if($result == "Wed"){
$wed[] = date("Y-m-d", strtotime($day)). " ".$result."<br>";
}
}
return $wed;
}
$wed = getDays($year,$month);
print_r($wed);
答案 10 :(得分:-2)
如果没有给出DateTime,你需要知道一个日期的日期 - 例如unix时代的开始(1970年1月1日)。
从那里开始,你只需找到第一个星期三,然后从那里找到你的月份。请记住闰年,你很好。
显然,它不是世界上最有效的算法,但它可以完成这项任务。