【发布时间】:2012-10-29 20:08:37
【问题描述】:
只要您所在国家/地区一周的第一天是星期日,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');
有没有办法改变这个或范围的日期时间?无法想象这不是一个环境,因为欧洲大部分地区都是从星期一开始的。
添加: 发布完整的日历和功能代码不会让事情变得更清楚。但这里以一行为例。 我经常需要检查一周的第一天是什么,或者计算从一周的第一天到该周的不同日期和时间。我的代码充满了这些:
$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 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');
【问题讨论】:
-
您到底面临什么问题?
-
听起来像是 XY 问题。星期日被映射到 0 的事实不应该阻止您使用不同的技术来确定星期的开始,就像其他任何一天一样。
-
你的问题很抽象。提供用于创建日历的代码。至于你的问题目前没有答案
-
我看不出问题;
echo $dateTime->format( 'N' );将为您提供从1到7的 "ISO-8601 numeric representation of the day of the week"(从星期一开始)。只需减去1即可获得零索引表示。