当前位置: 首页 > 面试题库 >

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

赵嘉赐
2023-03-14
问题内容

只要您所在国家/地区的一周中的第一天是星期日,PHP(5.3+)中的DateTime类就可以很好地工作。在荷兰,每周的第一天是星期一,这使得该班级无法用周视图和计算来构建日历。

我似乎找不到关于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()类可以与monday一起用作一周的第一天。 如果不是,可以将班级扩展为使用星期一作为一周的第一天。

更新:
好的,我想我要走了……我不是编码课程的专业人士。但这似乎在数周内都有效。但是它仍然需要第一天,第二天…以及星期天本身的名称规则。我认为这不是万无一失的。我将不胜感激来修复它。

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

}

}


 类似资料:
  • 我正在使用firebase并用Android构建一个应用程序。 我有一个,我可以在其中选择星期几、小时和分钟。 当我选择日期并按submit时,我不想存储当前日期,甚至不想存储所选日期,而是存储与所选星期相关的下一个日期。 假设我选择星期四,明天是星期四,我想保存当前用户选择的日期和时间。 当时我试过这样的方法: 小时和分钟很好,但是我如何存储第二天/月/年?

  • 问题内容: 我要用。 问题是,如果今天是星期一,它将返回什么?它似乎正在返回上周星期一的日期。在这种情况下,如何使它返回今天的日期? 问题答案: 在这种情况下,如何使它返回今天的日期? 伪代码: 顺便说一句,这个技巧也可以起作用:

  • 问题内容: 我目前正在使用vbscript函数以2/12/2009格式获取本周和上周的第一天值。我想知道是否可以使用SQL查询。 问题答案: 这些语句应该在TSQL中完成您想要的操作。请注意,这些报表基于当前日期。您可以将getdate()替换为所需的任何日期:

  • 问题内容: 我需要最快的方式来获得一周的第一天。例如:今天是11月11日,是星期四;我想要本周的第一天(即11月8日)和一个星期一。我需要用于MongoDB地图功能的最快方法,有什么想法吗? 问题答案: 使用Date对象的方法,您可以知道星期几(0 =星期日,1 =星期一,等等)。 然后,您可以减去该天数加一,例如:

  • 问题内容: 如果我有特定的星期数(例如51)和给定的年份(例如2008),我如何找到同一周的第一个星期一的日期? 非常感谢 问题答案: 假设一周的第一天是星期一,请使用,而不是一周的第一天是星期日。有关详细信息,请参见strptime文档。 更新: 固定星期数。该指令基于0,因此第51周应输入为50,而不是51。

  • 问题内容: 我们有一个实用程序,它将在周一至周五之间的任何一天运行。它将在内容管理工具中更新一些文件。与该文件关联的最后修改日期应该是该周的星期一日期。我编写了以下程序来检索当前周的星期一日期。但是我仍然不确定这是否适用于所有情况。有谁有更好的解决方案? 问题答案: 我强烈建议您改用Joda Time(对于您的所有日期/时间工作,而不仅限于此): 请注意,正如您在此处所使用的 星期一 (即Joda