在php中获取两个日期之间的周数

3

我希望获得从2012-01-01到2012-12-31给定的两个日期之间的周数。这些周数应该正好在上述范围内。请问如何实现这一目标。


周数?你是指两个日期之间的周数吗?还是指出现在这两个日期之间的周数数组? - BenM
2012年1月1日至2012年12月31日之间的周数为52。 - cwallenpoole
发生在周数数组之间。 - user2286462
4
那么,您目前尝试了什么? - N.B.
类似于:http://stackoverflow.com/a/7223996/1276124。首先,您需要创建一个包含第一个日历日(星期日/星期一)的数组。然后循环这些日期。 - Ryan B
谢谢回复。但是这里的第52周出现了重复。 - user2286462
5个回答

3

类似这样的代码应该可以正常工作:

<?php
    $startDateUnix = strtotime('2012-01-01');
    $endDateUnix = strtotime('2013-01-01');

    $currentDateUnix = $startDateUnix;

    $weekNumbers = array();
    while ($currentDateUnix < $endDateUnix) {
        $weekNumbers[] = date('W', $currentDateUnix);
        $currentDateUnix = strtotime('+1 week', $currentDateUnix);
    }

    print_r($weekNumbers);
?>

DEMO.

Output:

Array
(
    [0] => 52
    [1] => 01
    [2] => 02
    .........
    [51] => 51
    [52] => 52
)

@user2286462 它给你什么,你期望得到什么? - h2ooooooo
实际上,我有日期过滤器,如当前月份、上个月份、指定月份、当前年份、上一年份、指定年份、本季度、上一季度等。当我选择其中任何一个时,我会生成一个范围内的两个日期。当我选择后,我想要显示所选范围内的周数,无论是月份、年份还是季度。 - user2286462
你理解了需求吗? - user2286462
第52周 星期二 2012年12月25日至2012年12月31日 第01周 星期二 2012年1月3日至2012年1月9日 第02周 星期二 2012年1月10日至2012年1月16日 第03周 星期二 2012年1月17日至2012年1月23日 第04周 星期二 2012年1月24日至2012年1月30日 第05周 星期二 2012年1月31日至2012年2月6日 第10周 星期二 2012年3月6日至2012年3月12日 第11周 星期二 2012年3月13日至2012年3月19日 第12周 星期二 2012年3月20日至2012年3月26日 第13周 星期二 2012年3月27日至2012年4月2日 第51周 星期二 2012年12月18日至2012年12月24日 第52周 星期二 2012年12月25日至2012年12月31日 - user2286462
很好,我建议将$weekNumbers[]更改为$weekNumbers[date("Y-m-d",$currentDateUnix)]。 - Oscar Javier Jimenez
显示剩余5条评论

2
这样的东西应该可以胜任工作:
$start = '2012-01-01';
$end = '2012-12-31';

$dates = range(strtotime($start), strtotime($end),604800);
$weeks = array_map(function($v){return date('W', $v);}, $dates); // Requires PHP 5.3+

print_r($weeks);

1
$start = '2012-12-15'; $end = '2013-03-21'; 会输出一个范围在 5012 之间的结果,这是错误的。 - h2ooooooo

2

我认为你想要类似以下使用DateTime的内容:

$first_date = new DateTime();
$last_date  = new DateTime('-50 weeks');
$days_array = array();
foreach(new DatePeriod($first_date, new DateInterval('P1D'), $last_date) as $date) {
  $days_array[] = $date->format('W');
}

日期管理充满陷阱。我也强烈建议使用Datetime,它允许您定义时区。 - Gabriel

0
您可以使用下面的weeks_between_dates()函数获取两个日期之间的周数。
function weeks_between_dates($d1,$d2)
{
    $t1 = strtotime($d1);
    $t2 = strtotime($d2);
    $out = array();
    while ($now <= $t2) {
        $out[] = date('W', $t1);
        $t1 = strtotime('+1 week', $t1);
    }
    return $out;
}

print_r( weeks_between_dates('2015-01-01','2015-12-31') ); // 01..53
print_r( weeks_between_dates('2016-01-01','2016-12-31') ); // 01..52

0

做类似这样的事情:

[已删除]

编辑

<?php

for($w = strtotime($start_date); $w <= strtotime($end_date); $w += 7 * 24 * 3600)
{
echo date("W", $w) . '<br />';
}

?>

如果$start_date是'2012-12-20',$end_date是'2013-03-04',那就会陷入无限循环。 - h2ooooooo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接