web-dev-qa-db-fra.com

Comment trouver le jour de la semaine en php dans un fuseau horaire spécifique

Je suis confus lors de l'utilisation de php pour gérer la date/heure.

Voici ce que j'essaie de faire: lorsqu'un utilisateur visite ma page, je lui demande son fuseau horaire puis affiche le "jour de la semaine" dans son fuseau horaire.

Je ne veux pas utiliser le jour du navigateur. Je veux faire ce calcul en php.

Voici comment j'essaie d'y parvenir:

  1. Le fuseau horaire entré par l'utilisateur
  2. Horodatage Unix calculé par la fonction php time ().

Mais je ne sais pas comment procéder ... Comment pourrais-je obtenir le "jour de la semaine" dans ce fuseau horaire.

92
varun
$dw = date( "w", $timestamp);

Où $ dw sera 0 (pour dimanche) à 6 (pour samedi) comme vous pouvez le voir ici: http://www.php.net/manual/en/function.date.php

142
Botond Béres

Ma solution est la suivante:

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

La sortie est: Tuesday

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

La sortie est: Tue

114
trante

Merci beaucoup les gars pour vos commentaires rapides.

C'est ce que je vais utiliser maintenant. Afficher la fonction ici pour que quelqu'un puisse l'utiliser.

public function getDayOfWeek($pTimezone)
{

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

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

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

}

Signaler si vous trouvez des corrections.

20
varun

Je pense que c'est la bonne réponse, changez simplement Europe/Stockholm au fuseau horaire des utilisateurs.

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

Représentation numérique ISO-8601 du jour de la semaine (ajouté de PHP 5.1.0)) 1 (du lundi) à 7 (du dimanche)

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

Pour obtenir une liste des fuseaux horaires pris en charge, voir http://php.net/manual/en/timezones.php

18
cjohansson

Un autre moyen rapide:

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

Si vous pouvez obtenir un décalage de fuseau horaire, vous pouvez simplement l'ajouter à l'horodatage actuel, puis utiliser la fonction gmdate pour obtenir leur heure locale.

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

Cela devrait fonctionner (ne l’a pas testé, donc YMMV). Cela fonctionne en stockant le fuseau horaire actuel du script, en le changeant en celui spécifié par l'utilisateur, en obtenant le jour de la semaine à partir de la fonction date() à l'horodatage spécifié, puis en rétablissant le timezone du script. était pour commencer.

Vous pourriez cependant avoir quelques aventures avec des identifiants de fuseau horaire.

3
Kalium

"Jour de la semaine" est en fait quelque chose que vous pouvez obtenir directement à partir de la fonction php date () avec le format "l" ou "N" respectivement. Regardez le manuel

edit: Désolé, je n'ai pas lu correctement les posts de Kalium, il l'a déjà expliqué. Ma faute.

2
HerdplattenToni

Basé sur l'une des autres solutions avec un drapeau pour basculer entre les semaines commençant le dimanche ou le lundi

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

La date de contrôle est le lundi ou le dimanche avant le dernier lundi ou le dernier dimanche

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