Come trovare il giorno della settimana in php in un fuso orario specifico


95

Sono confuso durante l'utilizzo di php per gestire data / ora.

Quello che cerco di fare è questo: quando un utente visita la mia pagina chiedo il suo fuso orario e quindi visualizzo il "giorno della settimana" nel suo fuso orario.

Non voglio usare la giornata del browser. Voglio fare questo calcolo in php.

Ecco come sto cercando di ottenerlo:

  1. Il fuso orario inserito dall'utente
  2. Timestamp Unix calcolato dalla funzione php time ().

Ma non so come procedere ... Come ottenere il "giorno della settimana" in questo fuso orario.

Risposte:


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

Dove $ dw sarà da 0 (per domenica) a 6 (per sabato) come puoi vedere qui: http://www.php.net/manual/en/function.date.php


65
A partire da php 5.1.0 è possibile utilizzare date("N", $timestamp)per ottenere 1..7valori a partire da lunedì. Nelle versioni precedenti è possibile utilizzare il trucco (date("w", $timestamp) + 6) % 7per ottenere 0..6valori a partire dal lunedì.
oluckyman

22
Sono molto confuso. Come fa ad avere così tanti voti? La domanda è come ottenere il giorno della settimana in un fuso orario specifico, non il fuso orario del server web e non il GMT. Ciò risponde alla prima parte della domanda, ma ignora completamente la seconda parte della domanda.
tfinniga

6
@tfinniga, penso che il motivo sia che molte persone vengono a questa domanda quando cercano come ottenere il giorno della settimana (come ho fatto io), e poi la votano, perché risponde alla loro domanda :)
dav

Tieni presente che date () e mktime () funzionano solo fintanto che ti muovi all'interno dell'era UNIX (1970 - 2038 / 0x0 - 0x7FFFFFFF in secondi). Usa le nuove "estensioni relative a data e ora" di PHP
eosphere

1
@dav Wow, probabilmente hai ragione, ma sembra proprio una pessima ragione. Mi sento come se stessi iniziando a sviluppare opinioni forti sullo sviluppatore php medio.
tfinniga

117

La mia soluzione è questa:

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

L'output è: Tuesday

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

L'output è: Tue


Funziona magnificamente. Ho usato la data ('D', strtotime ($ DATE)). La mia variabile $ DATE era già nel formato corretto. L'ho usato per identificare DOW in un database di report che ho creato. Quando si esegue una ricerca in più date, è utile avere quella piccola abbreviazione DOW in più.
user208145

21

Penso che questa sia la risposta corretta, basta cambiare Europe/Stockholmil fuso orario degli utenti.

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

Rappresentazione numerica ISO-8601 del giorno della settimana (aggiunta in PHP 5.1.0) da 1 (per lunedì) a 7 (per domenica)

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

Per un elenco dei fusi orari supportati, vedere http://php.net/manual/en/timezones.php


20

Grazie mille ragazzi per i vostri rapidi commenti.

Questo è ciò che userò ora. Pubblicare la funzione qui in modo che qualcuno possa usarla.

public function getDayOfWeek($pTimezone)
{

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

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

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

}

Segnala se trovi correzioni.


9

Un altro modo veloce:

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

5

Se puoi ottenere il loro fuso orario, puoi semplicemente aggiungerlo al timestamp corrente e quindi utilizzare la funzione gmdate per ottenere la loro ora locale.

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

Questo dovrebbe funzionare (non l'ho testato, quindi YMMV). Funziona memorizzando il fuso orario corrente dello script, cambiandolo in quello specificato dall'utente, ottenendo il giorno della settimana dalla date()funzione al timestamp specificato e quindi reimpostando il fuso orario dello script su quello con cui era all'inizio.

Tuttavia, potresti avere delle avventure con gli identificatori del fuso orario.


2

"Day of Week" è effettivamente qualcosa che puoi ottenere direttamente dalla funzione php date () con il formato "l" o "N" rispettivamente. Dai un'occhiata al manuale

modifica: Scusa se non ho letto correttamente i post di Kalium, lo ha già spiegato. Colpa mia.


2

La data di controllo è lunedì o domenica prima di arrivare all'ultimo lunedì o l'ultima domenica

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

Sebbene possa avere usi, non risponde alla domanda.
outis

2

Basato su una delle altre soluzioni con una bandiera per passare da una settimana all'altra a partire dalla domenica o dal lunedì

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

Sebbene possa avere usi, non risponde alla domanda.
outis

0

Le rappresentazioni standard basate su lettere delle parti della data sono fantastiche, tranne per il fatto che non sono così intuitive. Il modo molto più conveniente è identificare le astrazioni di base e una serie di implementazioni specifiche. Inoltre, con questo approccio, puoi trarre vantaggio dal completamento automatico.

Dato che qui stiamo parlando di datetimes, sembra plausibile che l'astrazione di base sia ISO8601DateTime. Una delle implementazioni specifiche è data / ora corrente, quella di cui hai bisogno quando a fa una richiesta al tuo backend, quindi Now()class. Il secondo che è di qualche utilità per te è un datetime adattato a un certo fuso orario. Non a caso, si chiama AdjustedAccordingToTimeZone. E infine, hai bisogno di un giorno della settimana nel fuso orario di un datetime passato: c'è una LocalDayOfWeekclasse per questo. Quindi il codice ha il seguente aspetto:

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

Per ulteriori informazioni su questo approccio, dai un'occhiata qui .


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

Sebbene questo snippet di codice possa risolvere la domanda, includere una spiegazione aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro e quelle persone potrebbero non conoscere i motivi del tuo suggerimento sul codice.
andreas
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.