PHP DateTime()类,将一周的第一天更改为星期一

Edw*_*ard 8 php datetime class

只要您所在国家/地区的第一天是星期日,PHP(5.3+)中的DateTime类就可以正常工作.在荷兰,一周的第一天是星期一,这使得课程无法用于构建具有周视图和计算的日历.

我似乎无法在Stackoverflow或其他互联网上找到关于如何让DateTime行动的答案,就像一周的第一天是星期一一样.

我在Stackoverflow上找到了这个部分,但它并没有解决你遇到麻烦的所有方法,而且这不是一个优雅的解决方案.

$dateTime = new DateTime('2012-05-14');
$monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week');
Run Code Online (Sandbox Code Playgroud)

有没有办法改变这个或扩展DateTime?无法想象这不是一个场景,因为大多数欧洲星期一开始他们的周.

补充: 发布完整的日历和功能代码不会让事情变得更清晰.但这里有一行例如.我经常要检查一周的第一天是什么,或者从一周的第一天计算到该周的不同日期和时间.我的代码充满了这些:

$startOfWeek = $date->modify(('Sunday' == $date->format('l')) ? 'Monday last week' : 'Monday this week')->modify('+3 hours')->format(DATETIME);
Run Code Online (Sandbox Code Playgroud)

我也得到了一个不想要的结果,试图获得一个月或一年的第一个完整周.由于我的$ date对象并不总是包含相同的日期,我必须以这种方式继续检查它,使代码难以阅读.在这个日历上有更多的编程要做,我无法预见它会再次发生错误.

编辑虽然存在一些不一致之处.由于一些奇怪的原因,DateTime确实得到了下一个权利:

$test = new DateTime('2012-10-29'); // Monday
echo $test->modify('Sunday this week')->format('Y-m-d');  // 2012-11-04

// But...

$test = new DateTime('2012-11-04'); // Sunday
echo $test->modify('Monday this week')->format('Y-m-d');  // 2012-11-05 instead of 2012-10-29   
Run Code Online (Sandbox Code Playgroud)

但我认为我可以使问题更清楚: DateTime()类可以与星期一一起用作一周的第一天.如果没有,可以将课程扩展为使用星期一作为一周的第一天.

更新: 好的,我想我已经到了某个地方......我不是编程班的专业人员......但这似乎有效数星期.但它仍然需要第一天,第二天的规则......以及星期日本身的日期.我不认为这是万无一失的.我将不胜感激任何修复它的帮助.

class EuroDateTime extends DateTime {

// Fields
private $weekModifiers = array (
    'this week',
    'next week',
    'previous week',
    'last week'
);

// Override "modify()"
public function modify($string) {

    // Search pattern
    $pattern = '/'.implode('|', $this->weekModifiers).'/';

    // Change the modifier string if needed
    if ( $this->format('N') == 7 ) { // It's Sunday
        $matches = array();
        if ( preg_match( $pattern, $string, $matches )) {
            $string = str_replace($matches[0], '-7 days '.$matches[0], $string);
        }
    }
    return parent::modify($string);

}

}
// This works
$test = new EuroDateTime('2012-11-04');
echo $test->modify('Monday this week')->format('Y-m-d');
// And I can still concatenate calls like the DateTime class was intended
echo $test->modify('Monday this week')->modify('+3 days')->format('Y-m-d');
Run Code Online (Sandbox Code Playgroud)

Edw*_*ard 6

我发现这个工作,但PHP的DateTime类有一些不一致.

如果离开日期是星期日,则前一个星期一不被视为同一周(由本课程确定).但是从星期一开始,下一个星期天被视为同一周.如果他们将来修复此类,则需要一些补充.

class EuroDateTime extends DateTime {

// Override "modify()"
public function modify($string) {

    // Change the modifier string if needed
    if ( $this->format('N') == 7 ) { // It's Sunday and we're calculating a day using relative weeks
        $matches = array();
        $pattern = '/this week|next week|previous week|last week/i';
        if ( preg_match( $pattern, $string, $matches )) {
            $string = str_replace($matches[0], '-7 days '.$matches[0], $string);
        }
    }
    return parent::modify($string);

}

}
Run Code Online (Sandbox Code Playgroud)