2016-07-10 72 views
0

我是一个php和codeigniter的新手。PHP减去一周周日

我有一个函数可以用来标记骑自行车上每公里骑行的周数总和的图表的x轴。它从今天的日期开始计算(或应该工作),从数组传递零周日或1,2,3等等。

我使用的PHP版本5.6.19,这是我的代码:

在Model:

public function week_start($date, $counter){ 
     $tstring = strtotime($date); 
     $wknumber = ($counter + 1); 
     $start = strtotime("-$wknumber weeks sunday", $tstring); 
    return array(date('M d', $start));} 

在控制器:

$datenumbers = array(0, 1, 2, 3, 4, 5, 6, 7); 
$dateResult = $this->bike_model->week_start(date("Y/m/d"), $datenumber); 

在视图:

  for ($i = 0; $i < 8; $i++){ 
      echo "<text class = \"axis\" y = \"357\" x = \""; 
      echo 26 + ($i*70); 
      echo "\" dy = \".35em\">"; 
      echo $dates_for_table[$i];} 

我已经拥有它了几天后,它已经在7月3日星期日显示为我的x-axis上的第一个数字,因为它应该有。但今天是星期天,我预计它现在将在7月10日星期日称为最近一周。不过,它仍然在上周日展示!

所以我的问题是,这里有一个错误,或者我误解了'一星期周日'应该如何工作?

我的目标是使用零作为参数返回最近一周的开始 - 如果是星期日或过去的星期日,则为当前星期日。我找到了一个解决方法,通过添加一个if else来检查函数是否是星期天。

if ($tstring == strtotime('this Sunday')){ 
    $wknumber = $counter;} 

else{ 
$wknumber = ($counter + 1);} 

但是,这感觉笨重,我正在寻找一个更优雅的方式。我还想了解“星期天一周”出了什么问题,因为我认为我已经理解它是如何工作的。

谢谢!

+0

我看到你的旧代码有'$启动=(日期(“​​W”,$ tstring) == 0)? $ tstring:strtotime('上周日',$ tstring);'。这不是解决你的问题吗? – codisfy

+0

这段代码是我尝试过的,但它最终让我在整个x轴上的当前星期天。我已经在模型的笔记中留下了该代码,以便更深入地思考如何实施。 – Cyclist

+0

我刚刚尝试了这个替代代码。基本上,问题在于它是在检查是否是星期天(是的!),如果是,则返回数组中每个值的今天日期。我能想到在轴上每个点上提前一周的唯一方法就是在原始问题底部的if/else语句。即使我现在的代码*看起来可以工作,我仍然没有打开这个问题,因为我仍然不清楚“ - $ i周周日”究竟是在做什么。除星期日之外,它每天都会给你上一个星期天,在这种情况下,它会给你当前的星期日吗? – Cyclist

回答

0

这里是我如何使用面向对象的DateTime风格做了类似的事情:

$startDate = new DateTime('NOW'); // can pass date string if not today 

# reset start date to last Sunday or today if it is Sunday: 
$startDate->sub(new DateInterval('P'.($startDate->format('w')).'D')); 

# for debugging, output first Sunday: 
echo $startDate->format('Y-m-d H:i:s') . " => full date and time (check for timezone issues) \n\n"; 

$weeks = 8; 
for ($i = 0; $i < $weeks; $i++) { 
    # don't decrement first pass; sub 1 week on subsequent: 
    $startDate->sub(new DateInterval('P'. (($i) ? 1 : 0) .'W')); 
    echo $startDate->format('Y-m-d') . "\n"; 
}; 

你应该能够为你的目的相适应。

如果你想获得幻想,你也可以使用DatePeriod,而不是一个循环内使用sub

$period = new DatePeriod(
    $startDate, 
    DateInterval::createFromDateString('-1 week'), 
    7 
); 
foreach ($period as $date) { 
    echo $date->format('Y-m-d') . "\n"; 
} 
+0

感谢您的代码@ldg。我的一些排行榜看起来非常有希望。然而,作为新手我不明白面向对象的日期时间样式。当你说新的Datetime和新的DateInterval时,这意味着什么?我在[PHP手册](http://php.net/manual/en/datetime.construct.php)中看到过类似的内容,但无法弄清楚。我现在在法国,所以需要上床睡觉,但是我会看看早晨是否可以把我的大脑包裹起来。谢谢! – Cyclist

+0

@Cyclist它与程序性的syle非常相似,请参阅http://php.net/manual/en/class.datetime.php和http://www.phptherightway.com/#date_and_time – ldg

+0

谢谢! PHP正确的方式网站是非常清晰的写...我以前没有去过那里,所以谢谢你。并感谢您的DatePeriod额外的想法。由于我的项目涉及很多日期,因此这和您的原始功能将非常有用。 – Cyclist

相关问题