Wie finde ich das Datum eines Wochentags aus einem Datum mit PHP?


85

Wenn ich eine habe $date YYYY-mm-ddund eine bestimmte $day(angegeben durch 0 (Sonntag) bis 6 (Samstag)) der Woche erhalten möchte, die YYYY-mm-ddin ist.

Zum Beispiel, wenn ich 2012-10-11als $dateund 5als bekam $day, möchte ich bekommen 2012-10-12, wenn ich 0als habe $day,2012-10-14

EDIT:
Die meisten von euch haben es falsch verstanden. Ich habe ein Datum $dateund möchte einen Tag erhalten, der mit 0-6 der gleichen Woche angegeben $dateist.

Also nein, ich will nicht den Tag von $date...


Wann beginnt deine Woche? Montag oder Sonntag? Ich weiß, dass es für die meisten Leute Montag ist, aber ich stelle nur sicher: p
keyser

3
Ich glaube nicht, dass die Leute, die geantwortet haben, die Frage richtig verstanden haben. Er möchte keine Nummer des Tages nach Datum erhalten (dies wäre das Datum ('w')), aber er möchte das Datum UND die Tagesnummer angeben und das entsprechende Datum aus derselben Woche erhalten, in der das angegebene Datum angegeben ist. .
Vafliik

Antworten:


127

Ich denke, das ist was du willst.

$dayofweek = date('w', strtotime($date));
$result    = date('Y-m-d', strtotime(($day - $dayofweek).' day', strtotime($date)));

86

Sie können die Funktion date () verwenden:

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

oder

date('l'); // dayname

Beispielfunktion zum Abrufen des Tages nr.:

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

echo getWeekday('2012-10-11'); // returns 4

17

Versuchen

$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)));

2
Guter Ansatz, aber wie Sie in Rezigneds Antwort sehen können, können Sie auch '1 Tag' verwenden, wodurch das $ days-Array unbrauchbar wird.
Zulakis

1
Dies scheint korrekter zu sein, da es das korrekte Datum 2012-10-14bei der Eingabe 0zurückgibt. @Rezigned gibt zurück2012-10-07
Carl

7

Wenn Ihr Datum bereits ein ist DateTimeoder DateTimeImmutableSie die formatMethode verwenden können.

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

Die Formatzeichenfolge ist identisch mit der von der Datumsfunktion verwendeten.


Um die beabsichtigte Frage zu beantworten:

$date_time->modify($target_day_of_week - $day_of_week . ' days');

5

Das PHP-Handbuch sagte:

w Numerische Darstellung des Wochentags

Sie können daher ein Datum mit mktime erstellen und darin verwenden date("w", $yourTime);


4

Gerade:

2012-10-11 als $ Datum und 5 als $ Tag

<?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;

?>

Das $ result = '2012-10-12' ist das, was Sie wollen.


1

Ich fürchte, Sie müssen es manuell tun. Ermitteln Sie den aktuellen Wochentag des Datums, berechnen Sie den Versatz und fügen Sie den Versatz zum Datum hinzu.

$current = date("w", $date)
$offset = $day - $current
$new_date = new DateTime($date)
    ->add(
        new DateInterval($offset."D")
    )->format('Y-m-d')

1
Vielen Dank für Ihren Ansatz, aber nein, ich muss es nicht manuell tun. Schauen Sie sich Rezigneds Antwort an.
Zulakis

1

Ich musste eine ähnliche Lösung für Portugiesisch (Brasilien) verwenden:

<?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)

1
<?php echo date("H:i", time()); ?>
<?php echo $days[date("l", time())] . date(", d.m.Y", time()); ?>

Einfach, das sollte den Trick machen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.