Como encontrar o dia da semana no php em um fuso horário específico

95

Estou confuso ao usar php para lidar com data / hora.

O que estou tentando fazer é o seguinte: quando um usuário visita minha página, estou perguntando seu fuso horário e exibindo o 'dia da semana' em seu fuso horário.

Não quero usar o dia do navegador. Eu quero fazer esse cálculo em php.

É assim que estou tentando alcançá-lo:

  1. O fuso horário inserido pelo usuário
  2. Carimbo de data / hora Unix calculado pela função php time ().

Mas não sei como proceder ... Como colocaria o 'dia da semana' neste fuso horário.

Matt Johnson-Pint
fonte

Respostas:

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

Onde $ dw será de 0 (para domingo) a 6 (para sábado) como você pode ver aqui: http://www.php.net/manual/en/function.date.php

Botond Béres
fonte
65
Desde o php 5.1.0 você pode usar date("N", $timestamp)para obter 1..7valores a partir de segunda-feira. Nas versões anteriores, você pode usar o truque (date("w", $timestamp) + 6) % 7para obter 0..6valores a partir de segunda-feira.
oluckyman
22
Estou muito confuso. Como isso tem tantos votos? A questão é como obter o dia da semana em um fuso horário específico, não no fuso horário do servidor da web e não no GMT. Isso responde à primeira parte da pergunta, mas ignora completamente a segunda parte da pergunta.
tfinniga
6
@tfinniga, acho que a razão é que muitas pessoas chegam a esta pergunta ao pesquisar como obter o dia da semana (como eu fiz) e, em seguida, votam, porque responde a sua pergunta :)
dia
Esteja ciente de que date () e mktime () só funcionam enquanto você se mover dentro da era UNIX (1970-2038 / 0x0 - 0x7FFFFFFF em segundos). Use o novo PHP "Date and Time Related Extensions"
eosphere
1
@dav Uau, provavelmente você está certo, mas esse parece ser um motivo muito ruim. Eu sinto que estou começando a desenvolver opiniões fortes sobre o desenvolvedor de php médio.
tfinniga
117

Minha solução é esta:

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

O resultado é: Tuesday

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

O resultado é: Tue

trante
fonte
Isso funciona lindamente. Eu usei data ('D', strtotime ($ DATE)). Minha variável $ DATE já estava no formato correto. Usei isso para identificar DOW em um banco de dados de relatórios que fiz. Ao pesquisar em várias datas, é bom ter aquela pequena abreviação DOW extra.
user208145
21

Acho que essa é a resposta correta, basta alterar Europe/Stockholmpara o fuso horário dos usuários.

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

Representação numérica ISO-8601 do dia da semana (adicionado no PHP 5.1.0) 1 (para segunda-feira) a 7 (para domingo)

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

Para obter uma lista de fusos horários suportados, consulte http://php.net/manual/en/timezones.php

Cjohansson
fonte
20

Muito obrigado pessoal por seus comentários rápidos.

Isso é o que vou usar agora. Postando a função aqui para que alguém possa usá-la.

public function getDayOfWeek($pTimezone)
{

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

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

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

}

Informe se você encontrar alguma correção.

Peão
fonte
9

Outra maneira rápida:

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

Se você puder obter a diferença de fuso horário, basta adicioná-la ao carimbo de data / hora atual e usar a função gmdate para obter a 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
fonte
3
$myTimezone = date_default_timezone_get();
date_default_timezone_set($userTimezone);
$userDay = date('l', $userTimestamp);
date_default_timezone_set($myTimezone);

Isso deve funcionar (não testei, então YMMV). Funciona armazenando o fuso horário atual do script, alterando-o para aquele especificado pelo usuário, obtendo o dia da semana da date()função no carimbo de data / hora especificado e, em seguida, configurando o fuso horário do script de volta ao que era para começar.

Você pode ter algumas aventuras com identificadores de fuso horário, no entanto.

Kalium
fonte
2

"Dia da semana" é na verdade algo que você pode obter diretamente da função php date () com o formato "l" ou "N" respectivamente. Dê uma olhada no manual

editar: Desculpe não ter lido os posts do Kalium direito, ele já explicou isso. Foi mal.

HerdplattenToni
fonte
2

Verifique a data é segunda ou domingo antes de obter a última segunda ou ú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);
}
user2214236
fonte
Embora isso possa ter utilidade, não responde à pergunta.
fora de
2

Com base em uma das outras soluções com um sinalizador para alternar entre semanas começando no domingo ou segunda-feira

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
fonte
Embora isso possa ter utilidade, não responde à pergunta.
fora de
0

As representações de partes de datas baseadas em letras padrão são excelentes, exceto pelo fato de não serem tão intuitivas. A maneira muito mais conveniente é identificar abstrações básicas e uma série de implementações específicas. Além disso, com essa abordagem, você pode se beneficiar do preenchimento automático.

Já que estamos falando de datetimes aqui, parece plausível que a abstração básica seja ISO8601DateTime. Uma das implementações específicas é a data e hora atual, aquela de que você precisa quando um faz uma solicitação ao seu back-end, portanto, Now()classe. O segundo, que é de alguma utilidade para você, é uma data e hora ajustada para algum fuso horário. Não surpreendentemente, é chamado AdjustedAccordingToTimeZone. E, finalmente, você precisa de um dia da semana em um fuso horário de uma data e hora passada: há uma LocalDayOfWeekaula para isso. Portanto, o código se parece com o seguinte:

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

Para saber mais sobre essa abordagem, dê uma olhada aqui .

Vadim Samokhin
fonte
-1
echo date('l', strtotime('today'));
Raafet Dhaouadi
fonte
Embora este snippet de código possa resolver a questão, incluir uma explicação realmente ajuda a melhorar a qualidade de sua postagem. Lembre-se de que você está respondendo à pergunta para leitores no futuro e essas pessoas podem não saber os motivos de sua sugestão de código.
andreas