【问题标题】:PHP- Display days weekly by giving 2 datesPHP- 通过给出 2 个日期每周显示天数
【发布时间】:2011-01-15 23:52:38
【问题描述】:

我想在给出 2 个日期之间按周数显示日期,如下例所示。这在PHP中可能吗?

如果日期是 2010-12-01 到 2010-12-19,它将显示如下。

week-1  
 2010-12-01  
 2010-12-02  
 2010-12-03  
 2010-12-04  
 2010-12-05  
 2010-12-06  
 2010-12-07  
week-2    
 2010-12-08  
 2010-12-09  
 2010-12-10  
 2010-12-11  
 2010-12-12  
 2010-12-13  
 2010-12-14  
week-3  
 2010-12-15  
 2010-12-16  
 2010-12-17  
 2010-12-18  
 2010-12-19  
and so on...  

我使用 mysql。它有开始日期结束结束日期字段。 先感谢您。

我可以在给出 2 个日期的人中获得多少周,并使用

显示它们
datediff('ww', '2010-12-01', '2010-12-19', false); I found on the internet.    

我可以显示两个日期之间的日期,如下所示。但是我无法按周对它们进行分组。

$sdate = "2010-12-01";
$edate = "2010-12-19";

$days = getDaysInBetween($sdate, $edate);
foreach ($days as $val)  
{  
echo $val;  
} 

function getDaysInBetween($start, $end) {   
// Vars   
$day = 86400; // Day in seconds   
$format = 'Y-m-d'; // Output format (see PHP date funciton)   
$sTime = strtotime($start); // Start as time   
$eTime = strtotime($end); // End as time   
$numDays = round(($eTime - $sTime) / $day) + 1;   
$days = array();   

// Get days   
for ($d = 0; $d < $numDays; $d++) {   
$days[] = date($format, ($sTime + ($d * $day)));   
}   

// Return days   
return $days;   
}

【问题讨论】:

  • 你在用mysql来获取这些日期吗?
  • 日期是否已排序?在一个数组中?请提供更多信息。
  • 我想他想在一定范围内显示每一天。按周分组。
  • 感谢您的快速回答。不,它们没有排序。 Mysql 有 2 个日期字段 start 和 enddate。
  • 是的,Marnix 你是对的。这可能吗?

标签: php


【解决方案1】:

新答案。

$current_date = strtotime('2010-12-01');
$end_date = strtotime('2010-12-19');
$day_count = 0;
$current_week = null;
do {
    if ((int)($day_count / 7) + 1 != $current_week) {
        $current_week = (int)($day_count / 7) + 1;
        echo 'week-'.$current_week.'<br />';
    }
    echo date('Y-m-d', $current_date).'<br />';
    $current_date = strtotime('+1 day', $current_date);
    $day_count ++;
} while ($current_date <= $end_date);

【讨论】:

  • 感谢 dqhendricks 的时间和精力。这也很好用。
【解决方案2】:

你肯定需要这个:Simplest way to increment a date in PHP?。编写一个 forloop 并每次增加一天。您还需要DateTime classdate 的功能。确实要求date('W', yourDateHere) 是个好主意。

你会得到这样的东西(伪代码)

$startDate;
$endDate;

$nrOfDays = dateDiffInDays($endDate, $startDate);
$currentWeek = date('W',$startDate);
for($i = 0; $i < $nrOfDays; $i++)
{
    $newDay = date('+$i day', $startDate); // get the incremented day
    $newWeek = date('W', $newDay); // get the week of the new day

    if($newWeek != $currentWeek) // check if we must print the new week, or if we are still in the current
    print $newWeek;

    print $newDay; // print the day
}

希望这会有所帮助。祝你好运。

【讨论】:

  • 他要求从 12 月开始第 1 周。你的方法行不通。
  • @dqhendricks:那就更简单了:只需保留一个额外的索引 $j,其中包含周数,从 1 开始。
【解决方案3】:

足以完成这项工作的工具:

  • strtotime('2010-11-23') - 从日期获取时间戳
  • strtotime('+1 day', $someTimestamp) - 获取第二天
  • date('W', $someTimestamp) - 获取周数(如果你想按 ISO 周数分组)
  • array_chunk($orderedListOfSuccessiveDates, 7) - 以 7 天为一组进行分组(如果您不想按 ISO 周数分组)

警告:永远不要通过将 86400 添加到时间戳来增加天数!当夏令时到来时,这是打破一切的最简单方法。使用strtotime 函数或DateTime 类。

【讨论】:

  • 他要求从 12 月开始第 1 周。你的方法行不通。
  • 哦...我认为这是巧合,2010 年 12 月 1 日是星期一。如果我们只想要 7 人一组,我添加了 array_chunk
【解决方案4】:

给你。尽管这是从星期日开始的几周(如果需要,只需将其更改为星期一)。如果日期不在同一年,它就不起作用。但这应该很容易解决。如果 not_same_year 那么 ...

$start_date = mktime(0, 0, 0, 12, 01, 2010);
$start_date_week_number = (int) date("W", $start_date);
$end_date = mktime(0, 0, 0, 12, 19, 2010);
$end_date_week_number = (int) date("W", $end_date);
$n = $start_date_week_number;
$w = 1;
$date = $start_date;

while($n <= $end_date_week_number) {
    echo("<strong>Week " . $w . "</strong><br />");
    $s = 0;
    $e = 6;
    if($n == $start_date_week_number) $s = (int) date("w", $start_date);
    elseif($n == $end_date_week_number) $e = (int) date("w", $end_date);
    while($s <= $e) {
        echo(date("j-m-y", $date) . "<br />");
        $c_date = getdate($date);
        $date = mktime($c_date['hours'], $c_date['minutes'], $c_date['seconds'], $c_date['mon'], $c_date['mday'] + 1, $c_date['year']);
        $s++;
    }
    $n++; $w++;
}

DEMO HERE

编辑:当我意识到你想计算周数时才修复它(而不是得到实际的周数)......

【讨论】:

    【解决方案5】:
        $startDate = new DateTime('2010-01-01');
        $endDate = new DateTime('2010-01-14');
        $weeksDays = getWeeksDaysBetween($startDate, $endDate);
    
        foreach($weeksDays as $week => $days)
        {
          echo "Week $week<ul>";
          foreach($days as $day){
            echo "<li>$day</li>";
          }
          echo "</ul>";
        }
    
      function getWeeksDaysBetween($startDate, $endDate)
      {
        $weeksDays = array();   
        $dateDiff = $endDate->diff($startDate);
        $fullDays = $dateDiff->d;
        $numWeeks = floor($fullDays / 7) + 1;
        $weeksDays[1][] = $startDate->format('Y-m-d');
        for ($i = 1; $i <= $fullDays; $i++)
        {
          $weekNum = floor($i / 7) + 1;
          $dateInterval  = DateInterval::createFromDateString("1 day");
          $weeksDays[$weekNum][] = $startDate->add($dateInterval)->format('Y-m-d');
        }
        return $weeksDays;
      }
    

    【讨论】:

    • 我希望我可以使用新的 PHP 的 DateTime 类。但是我的 PHP 还没有。希望在未来:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    相关资源
    最近更新 更多