Cómo encontrar el día de la semana en php en una zona horaria específica

95

Estoy confundido al usar php para manejar la fecha / hora.

Lo que estoy tratando de hacer es esto: cuando un usuario visita mi página, le pregunto su zona horaria y luego visualizo el 'día de la semana' en su zona horaria.

No quiero usar el día del navegador. Quiero hacer este cálculo en php.

Así es como estoy tratando de lograrlo:

  1. La zona horaria ingresada por el usuario
  2. Sello de tiempo Unix calculado por la función php time ().

Pero no sé cómo proceder ... ¿Cómo puedo obtener el "día de la semana" en esta zona horaria?

Matt Johnson-Pinta
fuente

Respuestas:

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

Donde $ dw será 0 (para el domingo) a 6 (para el sábado) como puede ver aquí: http://www.php.net/manual/en/function.date.php

Botond Béres
fuente
65
Desde php 5.1.0 puede usar date("N", $timestamp)para obtener 1..7valores a partir del lunes. En las versiones anteriores, puede usar el truco (date("w", $timestamp) + 6) % 7para obtener 0..6valores a partir del lunes.
oluckyman
22
Estoy muy confundido. ¿Cómo tiene esto tantos votos? La pregunta es cómo obtener el día de la semana en una zona horaria específica, no la zona horaria del servidor web ni GMT. Esto responde a la primera parte de la pregunta, pero ignora por completo la segunda parte de la pregunta.
tfinniga
6
@tfinniga, creo que la razón es que muchas personas llegan a esta pregunta cuando buscan cómo obtener el día de la semana (como hice yo), y luego votan a favor, porque responde a su pregunta :)
dav
Tenga en cuenta que date () y mktime () solo funcionan mientras se mueva dentro de la era UNIX (1970 - 2038 / 0x0 - 0x7FFFFFFF en segundos). Utilice las nuevas "Extensiones relacionadas con la fecha y la hora" de PHP
eosphere
1
@dav Vaya, probablemente tengas razón, pero esa parece una muy mala razón. Siento que estoy empezando a desarrollar opiniones sólidas sobre el desarrollador php promedio.
tfinniga
117

Mi solución es esta:

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

La salida es: Tuesday

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

La salida es: Tue

trante
fuente
Esto funciona de maravilla. Usé date ('D', strtotime ($ DATE)). Mi variable $ DATE ya estaba en el formato correcto. Usé esto para identificar DOW en una base de datos de informes que hice. Al buscar en varias fechas, tener esa pequeña abreviatura DOW adicional es bueno.
user208145
21

Creo que esta es la respuesta correcta, simplemente cambie Europe/Stockholma la zona horaria de los usuarios.

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

Representación numérica ISO-8601 del día de la semana (agregada en PHP 5.1.0) 1 (para lunes) a 7 (para domingo)

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

Para obtener una lista de las zonas horarias admitidas, consulte http://php.net/manual/en/timezones.php

cjohansson
fuente
20

Muchas gracias chicos por sus rápidos comentarios.

Esto es lo que usaré ahora. Publicar la función aquí para que alguien pueda usarla.

public function getDayOfWeek($pTimezone)
{

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

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

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

}

Informe si encuentra alguna corrección.

Peón
fuente
9

Otra forma rápida:

date_default_timezone_set($userTimezone);
echo date("l");
Andre
fuente
5

Si puede obtener su compensación de zona horaria, puede agregarla a la marca de tiempo actual y luego usar la función gmdate para obtener su hora local.

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

Esto debería funcionar (no lo probé, entonces YMMV). Funciona almacenando la zona horaria actual de la secuencia de comandos, cambiándola a la especificada por el usuario, obteniendo el día de la semana de la date()función en la marca de tiempo especificada y luego configurando la zona horaria de la secuencia de comandos a la que tenía al principio.

Sin embargo, es posible que tenga algunas aventuras con identificadores de zona horaria.

Kalium
fuente
2

El "día de la semana" es algo que puede obtener directamente de la función php date () con el formato "l" o "N" respectivamente. Eche un vistazo al manual

editar: Lo siento, no leí las publicaciones de Kalium correctamente, ya lo explicó. Culpa mía.

HerdplattenToni
fuente
2

La fecha de verificación es el lunes o domingo antes de obtener el último lunes o el último domingo

 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);
}
usuario2214236
fuente
Si bien esto puede tener usos, no responde a la pregunta.
salida el
2

Basado en una de las otras soluciones con una bandera para cambiar entre semanas comenzando el domingo o el lunes

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
fuente
Si bien esto puede tener usos, no responde a la pregunta.
salida el
0

Las representaciones estándar basadas en letras de partes de fecha son excelentes, excepto por el hecho de que no son tan intuitivas. La forma mucho más conveniente es identificar abstracciones básicas y una serie de implementaciones específicas. Además, con este enfoque, puede beneficiarse del autocompletado.

Dado que aquí estamos hablando de citas, parece plausible que la abstracción básica sea ISO8601DateTime. Una de las implementaciones específicas es la fecha y hora actual, la que necesita cuando realiza una solicitud a su backend, por lo tanto, Now()class. El segundo que es de alguna utilidad para usted es una fecha y hora ajustada a alguna zona horaria. No es sorprendente que se llame AdjustedAccordingToTimeZone. Y finalmente, necesita un día de la semana en la zona horaria de una fecha y hora pasada: hay una LocalDayOfWeekclase para eso. Entonces el código se parece a lo siguiente:

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

Para obtener más información sobre este enfoque, eche un vistazo aquí .

Vadim Samokhin
fuente
-1
echo date('l', strtotime('today'));
raafet dhaouadi
fuente
Si bien este fragmento de código puede resolver la pregunta, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo a la pregunta para los lectores en el futuro, y es posible que esas personas no conozcan los motivos de su sugerencia de código.
andreas