PHP的DateTime()班,每周的第一天改为星期一PHP的DateTime()班,每周的第一天改

2019-05-12 03:28发布

在PHP DateTime类(5.3+),只要作品好了当周贵国的第一天是周日。 在荷兰一周的第一天是星期一,并且只是使类无用的建设有周视图和计算的日历。

我似乎无法找到#2或答案互联网上如何有日期时间表现得好像一周的第一天是星期一休息。

我发现了这片#1,但它不解决,你可以遇到麻烦的所有方式,它不是一个完美的解决方案。

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

有没有办法来改变这种或程度的DateTime? 无法想象,因为大多数欧洲开始其周的星期一它不是一个设置。

补充:在发布完整的日历和功能的代码不会让事情更清晰。 但这里是一个一行为例。 我经常要检查周的第一天是什么,或从一周的第一天计算到不同的日期和时间,在这一周。 我的代码也越来越充满了这些:

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

我也得到了不想要的结果,试图让一个月或一年的第一个完整周。 正如我的$ date对象并不总是包含相同的日期我必须继续检查这种方式,使得代码难以阅读。 有更多的编程做这个日历,其中它再次将错误,我不能预见。

编辑有一些不一致的地方,但。 由于一些奇怪的原因,日期时间不会得到这个下一个正确的:

$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   

但我想我可以使问题更加清晰: 能否日期时间()类与周一作为一周的第一天。 如果没有,可以在类扩展到使用星期一作为一周的第一天。

更新:好吧,我想我找到感觉了...我不是在编码classes..but这似乎对周工作亲。 但它仍然需要规则,第一天,第二天......,也为一天的名字周日本身。 我不认为这是万无一失的。 我希望得到任何帮助,以解决它。

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');

Answer 1:

我发现这个工作,但也有在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);

}

}


Answer 2:

没有什么能阻止你手动修改的日期,以获得一周的“第一次”天,这取决于你的“第一次”的定义。 例如:

$firstDayOfWeek = 1; // Monday
$dateTime = new DateTime('2012-05-16'); // Wednesday

// calculate how many days to remove to get back to the "first" day
$difference = ($firstDayOfWeek - $dateTime->format('N'));
if ($difference > 0) { $difference -= 7; }
$dateTime->modify("$difference days");

var_dump($dateTime->format('r')); // "Mon, 14 May 2012 00:00:00 +0000"

注意输出变化如何改变$firstDayOfWeek ; 如果改为4以上(星期四),它会再考虑Thu, 10 May 2012 “第一”的日子。

编辑 :这是一个相当简单的例子。 要做到这一点,正确的方法是使用用户/系统的语言环境给你的“第一次”天,并从那里计算。 见这个问题的更多信息。



Answer 3:

我也感到困惑的是什么问题,因为DateTime 确实有一周的开始,从一个概念星期一:该N格式为您提供一周从周一计数至周日,周一是1和周日为7.另外的日子里,在W格式,得到一个星期号的唯一途径,也开始每周星期一。 (我记得好象荷兰周数并不完全像ISO周数,但是这是一个不同的故事)。 所以,你错过了什么功能是什么呢?

编辑所以,问题是(只?)的相对日期时间格式 ,如“本周一”给出错误的结果时,基准日是星期天。 从文档,它听起来就像DateTime只是推迟到strtotime ,这应该是语言环境相关。 所以,如果你有你的区域设置正确,这是行不通的,这听起来像一个bug(什么是值得)。



Answer 4:

您也可以启动,并与setISODate在本周结束,最后一个参数是ISO-daynumber的一周,周一是1和周日7

$firstday = new \DateTime();
$lastday = clone($firstday);
$firstday->setISODate($firstday->format("Y"),$firstday->format("W"),1);
$lastday->setISODate($firstday->format("Y"),$firstday->format("W"),7);


文章来源: PHP DateTime() class, change first day of the week to Monday