[RESOLU] Connaitre le GMT/UTC depuis la latitude et la longitude

Avatar du membre
Mammouth du PHP | 1564 Messages

22 nov. 2022, 19:12

Je cherche à savoir comment recevoir une date formatée comme ceci :

Code : Tout sélectionner

"2019-09-05T19:00:00-04:00" (ici New York avec le UTC -4)
J'ai la uniquement la date MySQL (DATETIME) et les coordonnées GPS (LAT,LON) pour situer le lieu de l'événement.

Je tente plusieurs fonctions PHP sans succès, elles ne fonctionnent même pas en local.
J'utilise PHP 7, c'est des fonctions qui sont opérationnelles de PHP 5 à 8, je comprends pas, une exemple de fonction qui me retourne cette erreur "Parse error: syntax error, unexpected ''en_US'' (T_CONSTANT_ENCAPSED_STRING), expecting ')'" :
$fmt = datefmt_create(
    'en_US',
    IntlDateFormatter::FULL,
    IntlDateFormatter::FULL,
    'America/Los_Angeles',
    IntlDateFormatter::GREGORIAN
);
echo 'Le premier format affiché est ' . datefmt_format($fmt, 0);

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

22 nov. 2022, 21:20

Moi j'aurai fait comme ça :
date_default_timezone_set("America/New_York");
echo date(DATE_ATOM, strtotime("2019-09-05 19:00:00")); // Affichera 2019-09-05T19:00:00-04:00
Par contre pour convertir une position GPS en timezone, c'est beaucoup plus complexe.
Voici une lib PHP opensource qui se base sur les données d'Openstreetmap :
https://github.com/minube/geo-timezone
Sinon, il y a des API commerciales :
https://developers.google.com/maps/docu ... e/overview
https://learn.microsoft.com/en-us/bingm ... -time-zone
https://www.geoapify.com/get-timezone-f ... oordinates
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Mammouth du PHP | 1564 Messages

22 nov. 2022, 21:41

Merci, j'ai vue cette lib mais il faut GEOS PHP, j'ai pas regardé si elle est installée sur un mutu OVH.

Ta solution me plaît, pour ceux qui le souhaite voici comment trouver le fuseau (approximatif car certains fuseaux sont biscornus, mais me convient pour mon cas)
//désolé, pas documentée, trouvée sur Stack Overflow
function get_nearest_timezone($cur_lat, $cur_long) {
		$timezone_ids = DateTimeZone::listIdentifiers();

//var_dump($timezone_ids);

    if($timezone_ids && isset($timezone_ids[0])) {

        $time_zone = '';
        $tz_distance = 0;

        //only one identifier?
        if (count($timezone_ids) == 1) {
            $time_zone = $timezone_ids[0];
        } else {

            foreach($timezone_ids as $timezone_id) {
                $getLocation = new DateTimeZone($timezone_id);
                $location = $getLocation->getLocation();
                $tz_lat   = $location['latitude'];
                $tz_long  = $location['longitude'];

                $theta    = $cur_long - $tz_long;
                $distance = (sin(deg2rad($cur_lat)) * sin(deg2rad($tz_lat))) 
                + (cos(deg2rad($cur_lat)) * cos(deg2rad($tz_lat)) * cos(deg2rad($theta)));
                $distance = acos($distance);
                $distance = abs(rad2deg($distance));
               //echo '<br />'.$timezone_id.' '.$distance; 

                if (!$time_zone || $tz_distance > $distance) {
                    $time_zone   = $timezone_id;
                    $tz_distance = $distance;
										//var_dump($getLocation);
                } 

            }
        }
        return  [
				$time_zone,
				];
				// return;
    }
    return 'none?';
}
//timezone for one NY co-ordinate
var_dump(get_nearest_timezone(49.38237,-123.13477));