Klasa DateTime w PHP (5.3+) działa świetnie, o ile pierwszy dzień tygodnia w Twoim kraju to niedziela. W Holandii pierwszym dniem tygodnia jest poniedziałek, co czyni klasę bezużyteczną do budowania kalendarza z widokiem tygodniowym i obliczeniami.PHP DateTime() klasy, zmiana pierwszego dnia tygodnia na poniedziałek
Nie mogę znaleźć odpowiedzi na Stackoverflow lub resztę Internetu na temat tego, jak ustawić DateTime tak, jakby pierwszy dzień tygodnia przypada na poniedziałek.
Znalazłem ten fragment na Stackoverflow, ale nie rozwiązuje on wszystkich problemów, które można wpakować w kłopoty i nie jest to eleganckie rozwiązanie.
$dateTime = new DateTime('2012-05-14');
$monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week');
Czy istnieje sposób na zmianę tego lub zakresu DateTime? Nie mogę sobie wyobrazić, że to nie jest miejsce, ponieważ większość Europy zaczyna się od poniedziałku.
Dodano: Opublikowanie pełnego kalendarza i kodu funkcji nie spowoduje, że sprawy staną się bardziej przejrzyste. Ale tutaj jest jedna linia na przykład. Często muszę sprawdzić, co oznacza pierwszy dzień tygodnia, lub obliczyć od pierwszego dnia tygodnia do innej daty i godziny w tym tygodniu. Mój kod jest coraz pełny z nich:
$startOfWeek = $date->modify(('Sunday' == $date->format('l')) ? 'Monday last week' : 'Monday this week')->modify('+3 hours')->format(DATETIME);
uzyskać również niepożądany rezultat próbuje uzyskać pierwszy pełny tydzień miesiąca lub roku. Ponieważ mój obiekt $ date nie zawsze zawiera tę samą datę, muszę to sprawdzać w ten sposób, co sprawia, że kod jest trudny do odczytania. Mając o wiele więcej programów do zrobienia w tym kalendarzu, nie mogę przewidzieć, gdzie znowu będzie się pojawiać.
EDYCJA Mimo to istnieją pewne niespójności. Z jakiegoś dziwnego powodu DateTime robi się to następny jedno prawo:
$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
Ale myślę, że mogę sprawić, że pytanie jaśniej: Czy DateTime() Klasa być stosowany w poniedziałek jako pierwszy dzień tygodnia. Jeśli nie, czy klasa może zostać rozszerzona na poniedziałek jako pierwszy dzień tygodnia.
UPDATE: Ok, myślę, że jestem coraz gdzieś ... Nie jestem pro na kodowanie classes..but to wydaje się działać za kilka tygodni. Ale nadal potrzebuje zasad na pierwszy dzień, drugi dzień ... a także na sam dzień na niedzielę. Nie sądzę, że to jest niezawodny. Byłbym wdzięczny za każdą pomoc, aby to naprawić.
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');
Na czym dokładnie polega problem? – Jon
Brzmi jak problem XY. Fakt, że niedziela jest mapowana na 0, nie powinien powstrzymywać cię przed użyciem innej techniki do określenia początku tygodni jak każdego innego dnia. – cmbuckley
Twoje pytanie jest abstrakcyjne. Podaj kod, którego używasz do tworzenia kalendarza. Na razie nie ma odpowiedzi na twoje pytanie. – BeRocket