Jak znaleźć datę dnia tygodnia na podstawie daty za pomocą PHP?

85

Jeśli mam $date YYYY-mm-ddi chcę uzyskać konkretny $day(określony przez 0 (niedziela) do 6 (sobota)) tygodnia, w którym YYYY-mm-ddjest.

Na przykład, jeśli mam 2012-10-11jako $datei 5jako $day, chcę uzyskać 2012-10-12, jeśli mam 0jako $day,2012-10-14

EDYCJA:
Większość z was źle to zrozumiała. Mam datę $datei chcę otrzymać dzień określony przez 0-6 tego samego tygodnia, $datew którym jest.

Więc nie, nie chcę dnia $date...

Zulakis
źródło
Kiedy zaczyna się Twój tydzień? Poniedziałek czy niedziela? Wiem, że dla większości ludzi jest poniedziałek, ale upewniam się tylko: p
keyser
3
Myślę, że ludzie, którzy odpowiedzieli, nie zrozumieli właściwie pytania. Nie chce uzyskać liczby dni po dacie (która byłaby datą („w”)), ale chce określić datę ORAZ numer dnia i otrzymać odpowiednią datę z tego samego tygodnia, w którym jest określona data. .
Vafliik

Odpowiedzi:

127

Myślę, że tego chcesz.

$dayofweek = date('w', strtotime($date));
$result    = date('Y-m-d', strtotime(($day - $dayofweek).' day', strtotime($date)));
Ponownie podpisany
źródło
87

Możesz użyć funkcji date ():

date('w'); // day of week

lub

date('l'); // dayname

Przykładowa funkcja pobierania numeru dnia:

function getWeekday($date) {
    return date('w', strtotime($date));
}

echo getWeekday('2012-10-11'); // returns 4
powtac
źródło
17

Próbować

$date = '2012-10-11';
$day  = 1;
$days = array('Sunday', 'Monday', 'Tuesday', 'Wednesday','Thursday','Friday', 'Saturday');
echo date('Y-m-d', strtotime($days[$day], strtotime($date)));
air4x
źródło
2
Dobre podejście, ale jak widać w odpowiedzi Rezigned, możesz również użyć „1 dzień”, co sprawi, że tablica $ days będzie bezużyteczna.
Zulakis,
1
Wydaje się to bardziej poprawne, ponieważ zwraca poprawną datę 2012-10-14po wprowadzeniu 0, @Rezigned zwraca2012-10-07
Carl
7

Jeśli Twoja randka już jest DateTimelub DateTimeImmutablemożesz skorzystać z formatmetody.

$day_of_week = intval($date_time->format('w'));

Ciąg formatu jest taki sam, jak używany przez funkcję daty .


Aby odpowiedzieć na zamierzone pytanie:

$date_time->modify($target_day_of_week - $day_of_week . ' days');
Johannes Buchholz
źródło
5

Podręcznik PHP powiedział:

w Numeryczne przedstawienie dnia tygodnia

Możesz zatem skonstruować datę za pomocą mktime i użyć w niej date("w", $yourTime);

niebieski112
źródło
4

Właśnie:

2012-10-11 jako $ date i 5 jako $ day

<?php
$day=5;
$w      = date("w", strtotime("2011-01-11")) + 1; // you must add 1 to for Sunday

echo $w;

$sunday = date("Y-m-d", strtotime("2011-01-11")-strtotime("+$w day"));

$result = date("Y-m-d", strtotime($sunday)+strtotime("+$day day"));

echo $result;

?>

Wynik $ = '2012-10-12' jest tym, czego chcesz.

lijinma
źródło
1

Obawiam się, że musisz to zrobić ręcznie. Uzyskaj bieżący dzień tygodnia daty, oblicz przesunięcie i dodaj przesunięcie do daty.

$current = date("w", $date)
$offset = $day - $current
$new_date = new DateTime($date)
    ->add(
        new DateInterval($offset."D")
    )->format('Y-m-d')
John Dvorak
źródło
1
Dziękuję za podejście, ale nie, nie muszę tego robić ręcznie. Spójrz na odpowiedź Rezigned.
Zulakis,
1

Musiałem użyć podobnego rozwiązania dla portugalskiego (Brazylia):

<?php
$scheduled_day = '2018-07-28';
$days = ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'];
$day = date('w',strtotime($scheduled_day));
$scheduled_day = date('d-m-Y', strtotime($scheduled_day))." ($days[$day])";
// provides 28-07-2018 (Sáb)
victorf
źródło
1
<?php echo date("H:i", time()); ?>
<?php echo $days[date("l", time())] . date(", d.m.Y", time()); ?>

To proste, powinno załatwić sprawę

Rune Bøge
źródło