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?

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


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


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


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.


9

Otra forma rápida:

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

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

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.


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.


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

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

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


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.