2010-07-28 16 views
7

Pracuję nad aplikacją php, która wymaga, aby wyodrębnić daty weekendów między dwiema datami, a następnie wstawić je jako pojedyncze rekordy do bazy danych mysql.Otrzymuj daty weekendowe w php

myślałem, czy istnieje prostszy sposób to zrobić, a nie będzie przez pętlę między datą rozpoczęcia i zakończenia oraz za każdy dzień sprawdzenie czy date('l', strtotime($date)) powroty „Saturday” i „Sunday”

Dzięki za Twój czas

Sunil

+7

Chciałem tylko powiedzieć, że prawdopodobieństwo otrzymania randek weekendowych za pomocą PHP jest niewielkie lub żadne; o) - waka waka waka. Teraz zobaczę, co mogę zrobić z odpowiedzią dla ciebie. W jakim formacie są 2 terminy - najlepiej UNIX? – Tim

+0

Pokonaj mnie na żart, tam, Tim ... – DGM

Odpowiedz

11

Jeśli używasz starszej instalacji PHP (lub nie mają klasy DateTime):

$now = strtotime("now"); 
$end_date = strtotime("+3 weeks"); 

while (date("Y-m-d", $now) != date("Y-m-d", $end_date)) { 
    $day_index = date("w", $now); 
    if ($day_index == 0 || $day_index == 6) { 
     // Print or store the weekends here 
    } 
    $now = strtotime(date("Y-m-d", $now) . "+1 day"); 
} 

Mamy pętli zakres dat i sprawdź, czy dzień jest indeksem 0 lub 6 (niedziela lub sobota).

+0

Dzięki. Konwertowałem datę początkową na czas i użyłem powyższej funkcji 'while (date ("Ymd", $ data_początkowa)! = Date ("Ymd", $ end_date)) { \t $ day_index = date ("w", $ data_początkowa); \t if ($ day_index == 0 || $ day_index == 6) { \t data echa ('Y-m-d', $ data początkowa). "
"; } \t $ start_date = strtotime (data ("Y-m-d", $ data początkowa). "+1 dzień"); } ' –

6

Dobrze Data php („N”) daje dzień tygodnia jest poniedziałek z 1 i 7 jest niedziela więc można wdrożyć to pod if dość łatwo.

3
$now = new DateTime("now"); 
$now->setTime(0,0); 
if (($now->format("l") == "Saturday") || ($now->format("l") == "Sunday")) 
    $d = $now; 
else 
    $d = new DateTime("next saturday"); 

$oneday = new DateInterval("P1D"); 
$sixdays = new DateInterval("P6D"); 
$res = array(); 
while ($d->getTimestamp() <= $endTimestamp) { 
    $res[] = $d->format("Y-m-d"); 
    $d = $d->add($oneday); 
    if ($d->getTimestamp() <= $endTimestamp) { 
     $res[] = $d->format("Y-m-d"); 
    } 
    $d = $d->add($sixdays); 
} 

Przykład z

$end = new DateTime("2010-08-20"); 
$endTimestamp = $end->getTimestamp(); 
 
array(6) { 
    [0]=> 
    string(10) "2010-07-31" 
    [1]=> 
    string(10) "2010-08-01" 
    [2]=> 
    string(10) "2010-08-07" 
    [3]=> 
    string(10) "2010-08-08" 
    [4]=> 
    string(10) "2010-08-14" 
    [5]=> 
    string(10) "2010-08-15" 
} 
0

To nie jest dobrze przetestowane, ale wydaje się działać wystarczająco dobrze. Zauważ, że jeśli $ start jest w weekend, a $ end jest tego samego dnia tygodnia, ale wcześniej, data reprezentowana przez $ end zostanie pominięta - dlatego najlepiej byłoby, gdyby znaczniki czasu były najlepiej o północy.

<?php 
$start = $now = 1280293200; // starting time 
$end = 1283014799; // ending time 
$day = intval(date("N", $now)); 
$weekends = array(); 
if ($day < 6) { 
    $now += (6 - $day) * 86400; 
} 
while ($now <= $end) { 
    $day = intval(date("N", $now)); 
    if ($day == 6) { 
    $weekends[] += $now; 
    $now += 86400; 
    } 
    elseif ($day == 7) { 
    $weekends[] += $now; 
    $now += 518400; 
    } 
} 
echo "Weekends from " . date("r", $start) . " to " . date("r", $end) . ":\n"; 
foreach ($weekends as $timestamp) { 
    echo date("r", $timestamp) . "\n"; 
} 
+0

Dlaczego nie używać 'strtotime'? Co się stanie, jeśli popełnisz literówkę w swoich magicznych liczbach? –

+0

Co ważniejsze, co się stanie, jeśli nastąpi zmiana czasu letniego ... – Artefacto

+0

Sądzę, że zakładałem, że znaczniki czasu będą UTC, aby uniknąć takich problemów. – Fraxtil

0

dla nikogo, że znajdzie to - Użyłem następujących czynności:

$start = new DateTime($this->year.'-'.$month.'-01'); 
$interval = new DateInterval('P1D'); 
$end = new DateTime($this->year.'-'.$month.'-31'); 

$period = new DatePeriod($start,$interval,$end); 

foreach ($period as $day){ 
    if ($day->format('N') == 6 || $day->format('N') == 7){ 
     $compulsory[$day->format('d')] = true; 
    } 
} 

Zmienić na swój zakres początkowy i końcowy zakresu i zamiast formatu tylko dw $ obowiązkowe - można zrobić d/m/Y dla bardziej znaczącej daty.