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

标签 php class datetime

只要您所在国家/地区一周的第一天是星期日,PHP (5.3+) 中的 DateTime 类就可以很好地工作。在荷兰,一周的第一天是星期一,这只会让类(class)无法构建具有周 View 和计算的日历。

我似乎无法在 Stackoverflow 或 Internet 的其余部分找到有关如何让 DateTime 表现得好像一周的第一天是星期一的答案。

我在 Stackoverflow 上找到了这篇文章,但它并没有解决您遇到麻烦的所有方式,也不是一个优雅的解决方案。

$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 对象并不总是包含相同的日期,所以我必须继续以这种方式检查它,从而使代码难以阅读。在这个日历上有更多的编程要做,我无法预见它会再次出现错误。

编辑 不过还是有些不一致。出于某种奇怪的原因,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   

但我想我可以把问题说得更清楚: DateTime() 类是否可以将星期一作为一周的第一天。如果不是,是否可以将类(class)扩展为使用星期一作为一周的第一天。

更新: 好的,我想我有所进展……我不是编码类(class)的专业人士……但这似乎可以持续数周。但它仍然需要第一天、第二天的规则……以及星期日本身的日期名称。我不认为这是万无一失的。我将不胜感激任何修复它的帮助。

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

最佳答案

我发现它可以工作,但在 PHP 的 DateTime 类中存在一些不一致。

如果出发日期是星期日,则前一个星期一不被视为同一周(由此类确定)。但是从星期一开始,下一个星期日被视为同一周。如果他们将来解决这个问题,这个类(class)将需要一些补充。

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

}

}

关于PHP DateTime() 类,将一周的第一天更改为星期一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13128854/

相关文章:

PHP - 存储 SELECT 查询并在 INSERT 查询中使用它

ios - 如何从不同的 swift 类重置变量/步进值

mysql - 使用触发器比较日期时出错

PHP:检查 DateTime 是否未过期

php - 如何在 php glob() 中定义多个模式

PHP 变量返回空值

php - 上传过程中如何停止超大文件上传?

java - 当一个对象只被定义时会发生什么?

c++ - 如何在类中使用 vector

java - 通过 JDBC 使用数据库时如何处理夏令时?