70 votes

PHP - strtotime, spécifier le fuseau horaire

J'ai une chaîne de date, disons ' 2008-09-11 '. Je veux obtenir un horodatage à partir de cela, mais je dois spécifier un fuseau horaire dynamiquement (plutôt que le fuseau par défaut de PHP).

Donc pour résumer, j'ai deux cordes :

$dateStr = '2008-09-11';
$timezone = 'Americas/New_York';

Comment puis-je obtenir l'horodatage pour cela ?

EDIT : L'heure de la journée sera le minuit de ce jour.... $dateStr = '2008-09-11 00:00:00' ;

1 votes

Pourquoi prendre en compte le fuseau horaire quand il n'y a pas d'heure spécifiée ?

0 votes

Désolé pour la confusion. Ce sera le minuit de ce jour (début du jour spécifié).

0 votes

Si vous prenez minuit comme heure par défaut, cela compte...

2voto

HPM Points 1069

Réponse laconique (pas besoin de changer le fuseau horaire par défaut)

$dateStr = '2008-09-11';
$timezone = 'America/New_York';
$time = strtotime(
    $dateStr, 
    // convert timezone to offset seconds
    (new \DateTimeZone($timezone))->getOffset(new \DateTime) - (new \DateTimeZone(date_default_timezone_get()))->getOffset(new \DateTime) . ' seconds'
);

Réponse loquace

Utilice strtotime La deuxième option de la fonction change le cadre de référence de la fonction. D'ailleurs je préfère ne pas mettre à jour le fuseau horaire par défaut du script :

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

int strtotime ( string $time [, int $now = time() ] )

La fonction s'attend à recevoir une chaîne de caractères contenant un format de date anglais et essayera d'analyser ce format en un timestamp Unix (le nombre de secondes depuis le 1er secondes depuis le 1er janvier 1970 00:00:00 UTC), par rapport à l'horodatage donné dans now, ou l'heure actuelle si now n'est pas fourni.

Et une aide

/**
 * Returns the timestamp of the provided time string using a specific timezone as the reference
 * 
 * @param string $str
 * @param string $timezone
 * @return int number of the seconds
 */
function strtotimetz($str, $timezone)
{
    return strtotime(
        $str, strtotime(
            // convert timezone to offset seconds
            (new \DateTimeZone($timezone))->getOffset(new \DateTime) - (new \DateTimeZone(date_default_timezone_get()))->getOffset(new \DateTime) . ' seconds'
        )
    );
}

var_export(
    date(
        'Y-m-d', 
        strtotimetz('this monday', 'America/New_York')
    )
);

Cette approche n'est peut-être pas la plus performante, mais elle fonctionne bien lorsque vous connaissez le fuseau horaire par défaut et le décalage. Par exemple, si le fuseau horaire par défaut est UTC et le décalage est -8 heures :

var_dump(
    date(
        'Y-m-d', 
        strtotime('this tuesday', strtotime(-8 . ' hours'))
    )
);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X