【问题标题】:PHP minus one week SundayPHP减去一周周日
【发布时间】:2016-11-12 17:25:09
【问题描述】:

我是 php 和 codeigniter 的新手。

我有一个函数,用于标记每周骑行公里数图表的 x 轴。它通过从今天的日期开始倒数(零个星期日或 1、2、3 等通过数组传递)来工作(或应该工作)。

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

在模型中:

    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];}

我已经使用它几天了,它在我的x-axis 上一直显示 7 月 3 日星期日作为第一个数字,这是应该的。但是今天是星期天,我希望它现在说 7 月 10 日星期日是我最近的一周。但是,它仍然在上周日显示!

所以我的问题是,这里是否存在错误,或者我是否误解了“一周周日”应该如何工作?

我的目标是让我的函数以零作为参数返回最近一周的开始时间——如果是星期天,则返回当前星期天或过去的星期天。我找到了一种解决方法,方法是在函数中添加一个 if else 来检查它是否是星期天。

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

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

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

谢谢!

【问题讨论】:

  • 我看到你的旧代码有 $start = (date('w', $tstring) == 0) ? $tstring : strtotime('last sunday', $tstring); 。这不是解决了你的问题吗?
  • 该代码是我尝试过的,但它最终在整个 x 轴上为我提供了当前星期日。我已将该代码留在模型的注释中,以便更多地考虑如何实现。
  • 我刚刚再次尝试了该替代代码。基本上,问题在于它正在检查它是否是星期天(是的!),如果是,则为数组中的每个值返回今天的日期。我认为在轴上的每个点上提前一周获得的唯一方法是原始问题底部的 if/else 语句。尽管我的代码现在 似乎 可以正常工作,但我仍将这个问题悬而未决,因为我仍然不清楚“- $i week Sunday”到底在做什么。它是否会在除星期日之外的每一天都为您提供上一个星期日,在这种情况下,它会为您提供当前的星期日吗?

标签: php mysql codeigniter date strtotime


【解决方案1】:

以下是我使用面向对象的 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";
}

【讨论】:

  • 感谢您的代码@ldg。对于我的一些图表来说,它看起来很有希望。但是,作为一个新手,我不了解面向对象的 Date Time 风格。当你说新的日期时间和新的日期间隔是什么意思?我在PHP manual 中看到过类似的东西,但无法弄清楚。我现在在法国,所以需要睡觉,但我会看看我是否可以在早上把我的大脑包起来。谢谢!
  • @Cyclist 它与程序样式非常相似,参见php.net/manual/en/class.datetime.phpphptherightway.com/#date_and_time
  • 谢谢! PHP the Right Way 网站写得很清楚......我以前没去过那里,所以谢谢你。并感谢您对 DatePeriod 的额外想法。这和你原来的功能将非常有用,因为我的项目涉及很多日期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多