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...

Zulakis
quelle
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)));
Rezigned
quelle
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
powtac
quelle
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)));
air4x
quelle
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');
Johannes Buchholz
quelle
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);

blue112
quelle
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.

Lijinma
quelle
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')
John Dvorak
quelle
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)
victorf
quelle
1
<?php echo date("H:i", time()); ?>
<?php echo $days[date("l", time())] . date(", d.m.Y", time()); ?>

Einfach, das sollte den Trick machen

Rune Bøge
quelle