每周指定日期重复事件,直到特定日期

2022-08-30 22:23:37

创建事件时,我需要以日期时间格式设置事件开始和事件结束()然后我可以选择设置该事件的每周重复,直到特定日期()但是我无法在数据库中正确插入重复事件。这是我所拥有的:0000-00-00 00:00:000000-00-00

$startDateTime = '2015-04-30 10:30:00';
$endDateTime = '2015-04-30 11:30:00';
$repeatEndDate = '2015-06-01';
$timestamp = strtotime($startDateTime);
$day_of_week = date('l', $timestamp);
$step  = 1;
$unit  = 'W';
$repeatStart = new DateTime($startDateTime);
$repeatEnd   = new DateTime($repeatEndDate);
$repeatStart->modify($day_of_week);  
$interval = new DateInterval("P{$step}{$unit}");
$period   = new DatePeriod($repeatStart, $interval, $repeatEnd);

foreach ($period as $key => $date ) {
    $repeatQuery = 'INSERT INTO event(start,end,status,repeats) VALUES ("'.$startDateTime.'","'.$endDateTime.'","'.$status.'","'.$repeatEndDate.'")';
    $repeatResult = mysqli_query($db, $repeatQuery) or die (mysqli_error($db));
}

当我这样做时,它看起来像这样,没有实际时间只是print_r($date);00:00:00

DateTime Object
(
    [date] => 2015-04-30 00:00:00
    [timezone_type] => 3
    [timezone] => Europe/Berlin
)

我知道我不能像那样插入值,但我不知道如何从对象中获取正确的值。因此,在此示例中,我需要插入从 2015-04-30 开始到 2015-04-30 结束,到 2015-06-01 结束的每个星期四以 11:30:00 结束的事件(事件始终在同一天结束)。如何实现这一点?

谢谢


答案 1

问题是你用一个日期名称打电话(目前是“星期四”)。此值是根据变量计算的,然后用于修改该变量,因此它的唯一效果是将该实例的 Time 部分重置回 0:00:00。DateTime::modify$startDateTimeDateTime

下面给出了我期望的结果:(我已经注释掉了你需要从你的部分中删除的部分,以便更容易地看到差异)

date_default_timezone_set('Etc/UTC');

$startDateTime = '2015-04-30 10:30:00';
$endDateTime = '2015-04-30 11:30:00';
$repeatEndDate = '2015-06-01';
#$timestamp = strtotime($startDateTime);
#$day_of_week = date('l', $timestamp);
$step  = 1;
$unit  = 'W';
$repeatStart = new DateTime($startDateTime);
$repeatEnd   = new DateTime($repeatEndDate);
#$repeatStart->modify($day_of_week);  
$interval = new DateInterval("P{$step}{$unit}");
$period   = new DatePeriod($repeatStart, $interval, $repeatEnd);



foreach ($period as $key => $date ) {
    echo($date->format('Y-m-d H:i:s')) . PHP_EOL;
}

运行上述操作的结果是:

2015-04-30 10:30:00
2015-05-07 10:30:00
2015-05-14 10:30:00
2015-05-21 10:30:00
2015-05-28 10:30:00

答案 2

当您修改使用方法时,您使用的是格式字符,根据文档,该字符返回$repeatStartmodify()l

星期几的完整文本表示

通过将格式字符串更改为$day_of_week

$day_of_week = date('Y-m-d H:i:s', $timestamp);

我得到以下输出

DateTime Object
(
   [date] => 2015-04-30 10:30:00
   [timezone_type] => 3
   [timezone] => Europe/London
)
DateTime Object
(
    [date] => 2015-05-07 10:30:00
    [timezone_type] => 3
    [timezone] => Europe/London
)
DateTime Object
(
    [date] => 2015-05-14 10:30:00
    [timezone_type] => 3
    [timezone] => Europe/London
) 
DateTime Object
(
    [date] => 2015-05-21 10:30:00
    [timezone_type] => 3
    [timezone] => Europe/London
)
DateTime Object
(
    [date] => 2015-05-28 10:30:00
    [timezone_type] => 3
    [timezone] => Europe/London
)

虽然,修改实际上不是必需的,下面的代码应该实现您正在寻找的东西。

 <?php

$startDateTime = '2015-04-30 10:30:00';
$endDateTime = '2015-04-30 11:30:00';
$repeatEndDate = '2015-06-01';

$step  = 1;
$unit  = 'W';
$repeatStart = new DateTime($startDateTime);

$repeatEnd   = new DateTime($repeatEndDate);

$interval = new DateInterval("P{$step}{$unit}");
$period   = new DatePeriod($repeatStart, $interval, $repeatEnd);
foreach ($period as $key => $date ) {
    $repeatQuery = 'INSERT INTO event(start,end,status,repeats) VALUES ("'.$startDateTime.'","'.$endDateTime.'","'.$status.'","'.$repeatEndDate.'")';
    $repeatResult = mysqli_query($db, $repeatQuery) or die (mysqli_error($db));
    print_r($date);
}

推荐