Die DateTime-Klasse in PHP (5.3+) funktioniert einfach großartig, solange der erste Tag der Woche in Ihrem Land Sonntag ist. In den Niederlanden ist der erste Tag der Woche Montag und das macht die Klasse einfach nutzlos, um einen Kalender mit Wochenansicht und Berechnungen zu erstellen.PHP DateTime() -Klasse, ändern Sie den ersten Tag der Woche auf Montag
Ich kann nicht scheinen, eine Antwort auf Stackoverflow oder dem Rest des Internets zu finden, wie man DateTime so verhält, als wäre der erste Wochentag Montag.
Ich fand dieses Stück auf Stackoverflow, aber es repariert nicht alle Wege, die Sie in Schwierigkeiten geraten können, und es ist keine elegante Lösung.
$dateTime = new DateTime('2012-05-14');
$monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week');
Gibt es eine Möglichkeit, dieses oder Extent DateTime zu ändern? Ich kann mir nicht vorstellen, dass es nicht eine Einstellung ist, da die meisten von Europa ihre Wochen am Montag beginnen.
Hinzugefügt: Das Posten des vollen Kalender- und Funktionscodes macht die Dinge nicht klarer. Aber hier ist zum Beispiel eine Zeile. Ich muss oft überprüfen, was der erste Tag der Woche ist oder berechnen vom ersten Tag der Woche zu einem anderen Datum und Uhrzeit in dieser Woche. Mein Code ist immer voll von diesen:
$startOfWeek = $date->modify(('Sunday' == $date->format('l')) ? 'Monday last week' : 'Monday this week')->modify('+3 hours')->format(DATETIME);
ich auch ein unerwünschtes Ergebnis erhalten versuchen, die erste volle Woche des Monats oder des Jahres zu erhalten. Da mein $ date-Objekt nicht immer das gleiche Datum enthält, muss ich es auf diese Weise überprüfen, wodurch der Code schwer zu lesen ist. Da ich in diesem Kalender noch viel mehr programmieren kann, kann ich nicht vorhersehen, wo es wieder hinfliegen wird.
EDIT Es gibt jedoch einige Inkonsistenzen. Aus irgendeinem seltsamen Grund bekommt Datetime diese nächste rechts:
$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
Aber ich glaube, ich kann die Frage klarer machen: Kann die Datetime() der Klasse mit Montag als erster Tag der Woche verwendet werden. Wenn nicht, kann die Klasse auf Montag als ersten Tag der Woche erweitert werden.
UPDATE: Ok, ich glaube, ich bin immer irgendwo ... Ich bin kein Profi bei Codierung classes..but dies für die Wochen zu arbeiten scheint. Aber es braucht noch Regeln für den ersten Tag, den zweiten Tag ... und auch für den Namen Sonntag. Ich denke nicht, dass das narrensicher ist. Ich würde jede Hilfe schätzen, um es zu beheben.
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');
Was ist das Problem, dem Sie genau gegenüberstehen? – Jon
Klingt wie ein XY-Problem. Die Tatsache, dass Sonntag auf 0 abgebildet ist, sollte Sie nicht davon abhalten, eine andere Technik zu verwenden, um den Beginn der Wochen wie jeden anderen Tag zu bestimmen. – cmbuckley
Ihre Frage ist abstrakt. Geben Sie den Code an, mit dem Sie den Kalender erstellen. Für jetzt gibt es keine Antwort auf Ihre Frage – BeRocket