PHP减去一周周日
PHP minus one week Sunday
我是 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 日星期日是我最近的一周。不过上个周日还在放映!
所以我的问题是,这里是否存在错误,或者我是否误解了“- 一个星期日”应该如何工作?
我的目标是让我的函数以零作为参数 return 最近一周的开始——如果是星期日,则为当前星期日,或者是过去的星期日。我找到了一个解决方法,即在函数中添加一个 if else 来检查是否是星期天。
if ($tstring == strtotime('this Sunday')){
$wknumber = $counter;}
else{
$wknumber = ($counter + 1);}
但是,这感觉很笨拙,我正在寻找一种更优雅的方式。我还想了解“- one week Sunday”出了什么问题,因为我认为我已经了解它是如何工作的。
谢谢!
下面是我如何使用面向对象的 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";
}
我是 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 日星期日是我最近的一周。不过上个周日还在放映!
所以我的问题是,这里是否存在错误,或者我是否误解了“- 一个星期日”应该如何工作?
我的目标是让我的函数以零作为参数 return 最近一周的开始——如果是星期日,则为当前星期日,或者是过去的星期日。我找到了一个解决方法,即在函数中添加一个 if else 来检查是否是星期天。
if ($tstring == strtotime('this Sunday')){
$wknumber = $counter;}
else{
$wknumber = ($counter + 1);}
但是,这感觉很笨拙,我正在寻找一种更优雅的方式。我还想了解“- one week Sunday”出了什么问题,因为我认为我已经了解它是如何工作的。
谢谢!
下面是我如何使用面向对象的 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";
}