So finden Sie den Wochentag in PHP in einer bestimmten Zeitzone


95

Ich bin verwirrt, wenn ich PHP verwende, um mit Datum und Uhrzeit umzugehen.

Ich versuche Folgendes zu tun: Wenn ein Benutzer meine Seite besucht, frage ich nach seiner Zeitzone und zeige dann den "Wochentag" in seiner Zeitzone an.

Ich möchte den Tag des Browsers nicht nutzen. Ich möchte diese Berechnung in PHP machen.

So versuche ich es zu erreichen:

  1. Die vom Benutzer eingegebene Zeitzone
  2. Unix-Zeitstempel berechnet mit der Funktion php time ().

Aber ich weiß nicht, wie ich vorgehen soll ... Wie würde ich den "Wochentag" in dieser Zeitzone bekommen?

Antworten:


145
$dw = date( "w", $timestamp);

Wobei $ dw zwischen 0 (für Sonntag) und 6 (für Samstag) liegt, wie Sie hier sehen können: http://www.php.net/manual/en/function.date.php


65
Seit 5.1.0 PHP können Sie verwenden , date("N", $timestamp)erhalten 1..7Werte von Montag beginnen. In den älteren Versionen können Sie den Trick verwenden (date("w", $timestamp) + 6) % 7, um 0..6Werte ab Montag zu erhalten.
Oluckyman

22
Ich bin sehr verwirrt. Wie hat das so viele Stimmen? Die Frage ist, wie der Wochentag in einer bestimmten Zeitzone ermittelt werden kann, nicht in der Zeitzone des Webservers und nicht in GMT. Dies beantwortet den ersten Teil der Frage, ignoriert jedoch den zweiten Teil der Frage vollständig.
Tfinniga

6
@tfinniga, ich denke, der Grund ist, dass viele Leute auf diese Frage kommen, wenn sie suchen, wie man den Wochentag erhält (wie ich), und ihn dann abstimmen, weil er ihre Frage beantwortet :)
Dav

Beachten Sie, dass date () und mktime () nur funktionieren, solange Sie sich innerhalb der UNIX-Ära bewegen (1970 - 2038 / 0x0 - 0x7FFFFFFF in Sekunden). Verwenden Sie neue PHP "Date and Time Related Extensions"
Eosphere

1
@dav Wow, du hast wahrscheinlich recht, aber das scheint ein wirklich schlechter Grund zu sein. Ich habe das Gefühl, dass ich anfange, starke Meinungen über den durchschnittlichen PHP-Entwickler zu entwickeln.
Tfinniga

116

Meine Lösung lautet:

$tempDate = '2012-07-10';
echo date('l', strtotime( $tempDate));

Ausgabe ist: Tuesday

$tempDate = '2012-07-10';
echo date('D', strtotime( $tempDate));

Ausgabe ist: Tue


Das funktioniert wunderbar. Ich habe Datum ('D', Strtotime ($ DATE)) verwendet. Meine $ DATE-Variable hatte bereits das richtige Format. Ich habe dies verwendet, um DOW in einer von mir erstellten Berichtsdatenbank zu identifizieren. Bei der Suche über mehrere Daten hinweg ist es hilfreich, diese kleine zusätzliche DOW-Abkürzung zu haben.
user208145

21

Ich denke, dies ist die richtige Antwort. Wechseln Sie einfach Europe/Stockholmin die Zeitzone des Benutzers.

$dateTime = new \DateTime(
    'now',
    new \DateTimeZone('Europe/Stockholm')
);
$day = $dateTime->format('N');

ISO-8601 numerische Darstellung des Wochentags (hinzugefügt in PHP 5.1.0) 1 (für Montag) bis 7 (für Sonntag)

http://php.net/manual/en/function.date.php

Eine Liste der unterstützten Zeitzonen finden Sie unter http://php.net/manual/en/timezones.php


20

Vielen Dank Jungs für eure schnellen Kommentare.

Dies ist, was ich jetzt verwenden werde. Posten Sie die Funktion hier, damit jemand sie verwenden kann.

public function getDayOfWeek($pTimezone)
{

    $userDateTimeZone = new DateTimeZone($pTimezone);
    $UserDateTime = new DateTime("now", $userDateTimeZone);

    $offsetSeconds = $UserDateTime->getOffset(); 
    //echo $offsetSeconds;

    return gmdate("l", time() + $offsetSeconds);

}

Melden Sie, wenn Sie Korrekturen finden.


9

Ein weiterer schneller Weg:

date_default_timezone_set($userTimezone);
echo date("l");

5

Wenn Sie den Zeitzonenversatz erhalten können, können Sie ihn einfach zum aktuellen Zeitstempel hinzufügen und dann mit der Funktion gmdate die Ortszeit abrufen .

// let's say they're in the timezone GMT+10
$theirOffset = 10;  // $_GET['offset'] perhaps?
$offsetSeconds = $theirOffset * 3600;
echo gmdate("l", time() + $offsetSeconds);

3
$myTimezone = date_default_timezone_get();
date_default_timezone_set($userTimezone);
$userDay = date('l', $userTimestamp);
date_default_timezone_set($myTimezone);

Dies sollte funktionieren (nicht getestet, also YMMV). Dabei wird die aktuelle Zeitzone des Skripts gespeichert, in die vom Benutzer angegebene Zeitzone geändert, der Wochentag von der date()Funktion zum angegebenen Zeitstempel abgerufen und die Zeitzone des Skripts auf den ursprünglichen Wert zurückgesetzt.

Möglicherweise haben Sie jedoch einige Abenteuer mit Zeitzonen-IDs.


2

"Wochentag" ist eigentlich etwas, das Sie direkt von der Funktion php date () mit dem Format "l" bzw. "N" erhalten können. Schauen Sie sich das Handbuch an

edit: Sorry, ich habe die Beiträge von Kalium nicht richtig gelesen, das hat er schon erklärt. Mein Fehler.


2

Check-Datum ist Montag oder Sonntag, bevor Sie letzten Montag oder letzten Sonntag bekommen

 public function getWeek($date){
    $date_stamp = strtotime(date('Y-m-d', strtotime($date)));

     //check date is sunday or monday
    $stamp = date('l', $date_stamp);      
    $timestamp = strtotime($date);
    //start week
    if(date('D', $timestamp) == 'Mon'){            
        $week_start = $date;
    }else{
        $week_start = date('Y-m-d', strtotime('Last Monday', $date_stamp));
    }
    //end week
    if($stamp == 'Sunday'){
        $week_end = $date;
    }else{
        $week_end = date('Y-m-d', strtotime('Next Sunday', $date_stamp));
    }        
    return array($week_start, $week_end);
}

Dies mag zwar Verwendung haben, beantwortet aber die Frage nicht.
Outis

2

Basierend auf einer der anderen Lösungen mit einem Flag zum Wechseln zwischen Wochen ab Sonntag oder Montag

function getWeekForDate($date, $weekStartSunday = false){

    $timestamp = strtotime($date);

    // Week starts on Sunday
    if($weekStartSunday){
        $start = (date("D", $timestamp) == 'Sun') ? date('Y-m-d', $timestamp) : date('Y-m-d', strtotime('Last Sunday', $timestamp));
        $end = (date("D", $timestamp) == 'Sat') ? date('Y-m-d', $timestamp) : date('Y-m-d', strtotime('Next Saturday', $timestamp));
    } else { // Week starts on Monday
        $start = (date("D", $timestamp) == 'Mon') ? date('Y-m-d', $timestamp) : date('Y-m-d', strtotime('Last Monday', $timestamp));
        $end = (date("D", $timestamp) == 'Sun') ? date('Y-m-d', $timestamp) : date('Y-m-d', strtotime('Next Sunday', $timestamp));
    }

    return array('start' => $start, 'end' => $end);
}

Dies mag zwar Verwendung haben, beantwortet aber die Frage nicht.
Outis

0

Standardmäßige buchstabenbasierte Darstellungen von Datumsteilen sind großartig, außer dass sie nicht so intuitiv sind. Der viel bequemere Weg besteht darin, grundlegende Abstraktionen und eine Reihe spezifischer Implementierungen zu identifizieren. Außerdem können Sie mit diesem Ansatz von der automatischen Vervollständigung profitieren.

Da es sich hier um Datumsangaben handelt, erscheint es plausibel, dass die grundlegende Abstraktion ist ISO8601DateTime. Eine der spezifischen Implementierungen ist die aktuelle Datums- und Uhrzeitangabe, die Sie benötigen, wenn a eine Anforderung an Ihr Backend stellt, daher Now()Klasse. Die zweite, die für Sie von Nutzen ist, ist eine auf eine bestimmte Zeitzone angepasste Datums- und Uhrzeitangabe. Es überrascht nicht, dass es heißt AdjustedAccordingToTimeZone. Und schließlich benötigen Sie einen Wochentag in der Zeitzone eines verstrichenen Datums: Dafür gibt es eine LocalDayOfWeekKlasse. Der Code sieht also wie folgt aus:

(new LocalDayOfWeek(
    new AdjustedAccordingToTimeZone(
        new Now(),
        new TimeZoneFromString($_POST['timezone'])
    )
))
    ->value();

Weitere Informationen zu diesem Ansatz finden Sie hier .


-1
echo date('l', strtotime('today'));

Während dieses Code-Snippet die Frage lösen kann, hilft eine Erklärung wirklich dabei, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage in Zukunft für Leser beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen.
Andreas
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.