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


95

Je suis confus lorsque j'utilise php pour gérer la date / l'heure.

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

Je ne veux pas utiliser la journée du navigateur. Je veux faire ce calcul en php.

Voici comment j'essaye d'y parvenir:

  1. Le fuseau horaire saisi 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.

Réponses:


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

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


65
Depuis php 5.1.0, vous pouvez utiliser date("N", $timestamp)pour obtenir des 1..7valeurs à partir de lundi. Dans les anciennes versions, vous pouvez utiliser l'astuce (date("w", $timestamp) + 6) % 7pour obtenir des 0..6valeurs à partir de lundi.
oluckyman

22
Je suis très confus. Comment cela a-t-il autant de votes? La question est de savoir comment obtenir le jour de la semaine dans un fuseau horaire spécifique, pas le fuseau horaire du serveur Web, ni GMT. Cela répond à la première partie de la question, mais ignore complètement la deuxième partie de la question.
tfinniga

6
@tfinniga, je pense que la raison est que beaucoup de gens viennent à cette question en cherchant comment obtenir le jour de la semaine (comme je l'ai fait), puis votent, car cela répond à leur question :)
dav

Sachez que date () et mktime () ne fonctionnent que tant que vous vous déplacez dans l'ère UNIX (1970 - 2038 / 0x0 - 0x7FFFFFFF en secondes). Utiliser les nouvelles extensions PHP liées à la date et à l'heure
eosphere

1
@dav Wow, vous avez probablement raison, mais cela semble être une très mauvaise raison. J'ai l'impression que je commence à développer de fortes opinions sur le développeur PHP moyen.
tfinniga

117

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


Cela fonctionne à merveille. J'ai utilisé date ('D', strtotime ($ DATE)). Ma variable $ DATE était déjà au format correct. Je l'ai utilisé pour identifier DOW dans une base de données de rapports que j'ai créée. Lorsque vous effectuez une recherche sur plusieurs dates, il est agréable d'avoir cette petite abréviation DOW supplémentaire.
user208145

21

Je pense que c'est la bonne réponse, changez simplement Europe/Stockholmle 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ée en PHP 5.1.0) 1 (pour lundi) à 7 (pour dimanche)

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

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


20

Merci beaucoup les gars pour vos commentaires rapides.

C'est ce que j'utiliserai maintenant. Publier 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);

}

Signalez si vous trouvez des corrections.


9

Un autre moyen rapide:

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

5

Si vous pouvez obtenir leur 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);

3
$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). Il fonctionne en stockant le fuseau horaire actuel du script, en le remplaçant par celui spécifié par l'utilisateur, en obtenant le jour de la semaine à partir dudate() fonction à l'horodatage spécifié, puis en redéfinissant le fuseau horaire du script sur ce qu'il était au départ.

Cependant, vous pourriez avoir des aventures avec des identifiants de fuseau horaire.


2

"Day of Week" est en fait quelque chose que vous pouvez obtenir directement à partir de la fonction php date () avec le format "l" ou "N" respectivement. Jetez un œil au manuel

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


2

La date de vérification 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);
}

Bien que cela puisse avoir des utilisations, cela ne répond pas à la question.
sortie le

2

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

Bien que cela puisse avoir des utilisations, cela ne répond pas à la question.
sortie le

0

Les représentations à base de lettres standard des parties de date sont excellentes, sauf qu'elles ne sont pas si intuitives. Le moyen beaucoup plus pratique est d'identifier les abstractions de base et un certain nombre d'implémentations spécifiques. De plus, avec cette approche, vous pouvez bénéficier de l'auto-complétion.

Puisque nous parlons ici de datetimes, il semble plausible que l'abstraction de base soit ISO8601DateTime. L'une des implémentations spécifiques est la date / heure actuelle, celle dont vous avez besoin quand a fait une requête à votre backend, donc Now()class. Le deuxième qui est d'une certaine utilité pour vous est un datetime ajusté à un fuseau horaire. Sans surprise, il s'appelle AdjustedAccordingToTimeZone. Et enfin, vous avez besoin d'un jour de la semaine dans le fuseau horaire d'une date / heure passée: il existe une LocalDayOfWeekclasse pour cela. Le code ressemble donc à ce qui suit:

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

Pour en savoir plus sur cette approche, jetez un œil ici .


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

Bien que cet extrait de code puisse résoudre la question, inclure une explication aide vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question aux lecteurs à l'avenir, et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code.
andreas
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.