只要您所在国家/地区的一周中的第一天是星期天,PHP中的DateTime类(5.3+)就会很有用。在荷兰,星期一的第一天是星期一,这让班级无法用周历和计算来制作日历。PHP DateTime()类,将星期几的第一天更改为星期一
我似乎无法在Stackoverflow或其他互联网上找到关于如何使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对象并不总是包含相同的日期,所以我必须继续以这种方式进行检查,从而使代码难以阅读。在这个日历上有更多的编程工作,我不能预见它会再次出现问题。
编辑虽然有一些不一致之处。由于一些奇怪的原因,日期时间不会得到这个下一个正确的:
$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
但我想我可以使问题更加清晰: 能的日期时间()类与周一作为一周的第一天。如果不是的话,这个班级可以延长到星期一作为一周的第一天。
UPDATE: 好吧,我想我找到感觉了...我不是在编码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');
你到底面临的问题是什么? – Jon
听起来像一个XY问题。星期日映射为0的事实不应阻止您使用其他技术来确定每周的开始时间。 – cmbuckley
你的问题是抽象的。提供用于创建日历的代码。至于现在没有你的问题的答案 – BeRocket