Jak znaleźć dzień tygodnia w php w określonej strefie czasowej

95

Jestem zdezorientowany, używając PHP do obsługi daty / czasu.

Oto co próbuję zrobić: kiedy użytkownik odwiedza moją stronę, pytam o jego strefę czasową, a następnie wyświetlam „dzień tygodnia” w jego strefie czasowej.

Nie chcę korzystać z dnia przeglądarki. Chcę zrobić to obliczenie w php.

Oto jak staram się to osiągnąć:

  1. Strefa czasowa wprowadzona przez użytkownika
  2. Znacznik czasu systemu Unix obliczany przez funkcję php time ().

Ale nie wiem, jak postępować ... Jak uzyskać „dzień tygodnia” w tej strefie czasowej.

Matt Johnson-Pint
źródło

Odpowiedzi:

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

Gdzie $ dw będzie wynosić od 0 (niedziela) do 6 (sobota), jak widać tutaj: http://www.php.net/manual/en/function.date.php

Botond Béres
źródło
65
Od php 5.1.0 możesz używać date("N", $timestamp)do pobierania 1..7wartości począwszy od poniedziałku. W starszych wersjach możesz użyć sztuczki, (date("w", $timestamp) + 6) % 7aby uzyskać 0..6wartości począwszy od poniedziałku.
oluckyman
22
Jestem bardzo zmieszany. Jak to ma tyle głosów? Pytanie brzmi, jak ustawić dzień tygodnia w określonej strefie czasowej, a nie w strefie czasowej serwera WWW, a nie w GMT. To odpowiada na pierwszą część pytania, ale całkowicie pomija drugą część pytania.
tfinniga
6
@tfinniga, myślę, że powodem jest to, że wiele osób przychodzi na to pytanie, szukając, jak uzyskać dzień tygodnia (tak jak ja), a następnie głosować, ponieważ odpowiada na ich pytanie :)
dav
Pamiętaj, że date () i mktime () działają tylko tak długo, jak długo poruszasz się w erze UNIX (1970 - 2038 / 0x0 - 0x7FFFFFFF w sekundach). Użyj nowego PHP „Rozszerzenia związane z datą i czasem”
eosphere
1
@dav Wow, prawdopodobnie masz rację, ale wydaje się, że to naprawdę zły powód. Czuję, że zaczynam rozwijać mocne opinie na temat przeciętnego programisty php.
tfinniga
117

Moje rozwiązanie jest takie:

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

Wynik to: Tuesday

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

Wynik to: Tue

trante
źródło
To działa pięknie. Użyłem daty ('D', strtotime ($ DATE)). Moja zmienna $ DATE miała już prawidłowy format. Użyłem tego do identyfikacji DOW w bazie danych raportów, którą stworzyłem. Podczas wyszukiwania w wielu datach dobrze jest mieć ten mały dodatkowy skrót DOW.
user208145
21

Myślę, że to poprawna odpowiedź, po prostu zmień Europe/Stockholmstrefę czasową użytkowników.

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

Numeryczna reprezentacja dnia tygodnia w standardzie ISO-8601 (dodana w PHP 5.1.0) 1 (dla poniedziałku) do 7 (dla niedzieli)

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

Lista obsługiwanych stref czasowych jest dostępna pod adresem http://php.net/manual/en/timezones.php

cjohansson
źródło
20

Wielkie dzięki za wasze szybkie komentarze.

Właśnie tego będę teraz używać. Umieszczanie funkcji tutaj, aby ktoś mógł z niej skorzystać.

public function getDayOfWeek($pTimezone)
{

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

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

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

}

Zgłoś, jeśli znajdziesz jakieś poprawki.

Czeladnik
źródło
9

Kolejny szybki sposób:

date_default_timezone_set($userTimezone);
echo date("l");
Andre
źródło
5

Jeśli możesz uzyskać przesunięcie strefy czasowej, możesz po prostu dodać je do aktualnego znacznika czasu, a następnie użyć funkcji gmdate, aby uzyskać ich czas lokalny.

// let's say they're in the timezone GMT+10
$theirOffset = 10;  // $_GET['offset'] perhaps?
$offsetSeconds = $theirOffset * 3600;
echo gmdate("l", time() + $offsetSeconds);
nickf
źródło
3
$myTimezone = date_default_timezone_get();
date_default_timezone_set($userTimezone);
$userDay = date('l', $userTimestamp);
date_default_timezone_set($myTimezone);

To powinno działać (nie testowałem tego, więc YMMV). Działa poprzez przechowywanie bieżącej strefy czasowej skryptu, zmianę jej na tę określoną przez użytkownika, pobranie dnia tygodnia z date()funkcji o określonej sygnaturze czasowej, a następnie ustawienie strefy czasowej skryptu z powrotem na tę, od której miał zacząć.

Możesz mieć jednak przygody z identyfikatorami stref czasowych.

Kalium
źródło
2

„Dzień tygodnia” jest właściwie czymś, co można uzyskać bezpośrednio z funkcji php date () w formacie „l” lub „N”. Zajrzyj do instrukcji

edycja: Przepraszam, że nie przeczytałem poprawnie postów Kalium, on już to wyjaśnił. Mój błąd.

HerdplattenToni
źródło
2

Data czeku to poniedziałek lub niedziela przed ostatnim poniedziałkiem lub ostatnią niedzielą

 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);
}
user2214236
źródło
Chociaż może to mieć zastosowania, nie odpowiada na pytanie.
wyjazd
2

Oparty na jednym z pozostałych rozwiązań z flagą do przełączania między tygodniami zaczynającymi się w niedzielę lub poniedziałek

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);
}
Drinkynet
źródło
Chociaż może to mieć zastosowania, nie odpowiada na pytanie.
wyjazd
0

Standardowe reprezentacje części daty oparte na literach są świetne, z wyjątkiem faktu, że nie są tak intuicyjne. Znacznie wygodniejszym sposobem jest identyfikacja podstawowych abstrakcji i szeregu konkretnych implementacji. Poza tym dzięki takiemu podejściu możesz skorzystać z autouzupełniania.

Ponieważ mówimy tutaj o datach, wydaje się prawdopodobne, że podstawową abstrakcją jest ISO8601DateTime. Jedną z konkretnych implementacji jest aktualna data i godzina, ta, której potrzebujesz, gdy wysyła żądanie do twojego zaplecza, stąd Now()klasa. Drugi, który jest dla ciebie przydatny, to data i godzina dostosowana do jakiejś strefy czasowej. Nic dziwnego, że to się nazywa AdjustedAccordingToTimeZone. I wreszcie, potrzebujesz dnia tygodnia w strefie czasowej minionej daty i godziny: jest do tego LocalDayOfWeekklasa. Tak więc kod wygląda następująco:

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

Aby uzyskać więcej informacji na temat tego podejścia, zajrzyj tutaj .

Vadim Samokhin
źródło
-1
echo date('l', strtotime('today'));
raafet dhaouadi
źródło
Chociaż ten fragment kodu może rozwiązać problem, dołączenie wyjaśnienia naprawdę pomaga poprawić jakość Twojego posta. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a osoby te mogą nie znać powodów, dla których zaproponowałeś kod.
Andreas