8768 sujets

Développement web côté serveur, CMS

Bonjour !

J'utilise la librairie SunCalc (https://github.com/gregseth/suncalc-php) pour afficher les phases de la lune pendant une semaine. J'obtiens une série de valeur que j’arrondis en fraction de 0, 0.25, 0.5 et 0.75. (https://stackoverflow.com/questions/49036979/moon-phase-with-svg-graphics-in-node-js). Problème : les valeurs obtenues ne sont pas les bonnes, j'obtiens par exemple :

? Lundi 21
? Lundi 28 *
? Mardi 5 *
? Mercredi 13 *
? Mercredi 20 *
? Mercredi 27 *
? Jeudi 7 *
? Jeudi 14
* = valeurs incorrects

Au lieu de :
? Lundi 21
? Dimanche 27
? Lundi 4
? Mardi 12
? Mardi 19
? Mardi 26
? Mercredi 6
? Jeudi 14
(source : https://www.timeanddate.com/moon/phases/)

$date = new DateTime();
    for( $days = 60; $days--; ) {
        setlocale(LC_TIME, "fr_FR");
        $datej = $date->modify( '+1 days' )->getTimestamp();
        $datejourX = strftime("%A %e", $datej);
        // initialise library class with date and coordinates today's sunlight times for Paris
        $sc = new SunCalc($date, 43.89, 4.08);

        // format sunrise time from the DateTime object
        $sunTimes = $sc->getSunTimes();
        $sunriseStr = $sunTimes['sunrise']->format('H:i');
        // get position of the sun (azimuth and altitude) at today's sunrise
        $sunrisePos = $sc->getMoonIllumination($sunTimes['sunrise']);

        $sunp = $sunrisePos['phase'];
        //https://stackoverflow.com/questions/49036979/moon-phase-with-svg-graphics-in-node-js
        
        $datejour3 =  $sunp * 28;
        $datejour2 = floor($datejour3);
        $datejour = $datejour2 / 28;
        if ($datejour == 0) {
            echo "? " . $datejourX . '<br>';
        } elseif ($datejour == 0.25) {
            echo "? ". $datejourX . '<br>';
        } elseif ($datejour == 0.5) {
            echo "? ". $datejourX . '<br>';
        } elseif ($datejour == 0.75)  {
            echo "? ". $datejourX . '<br>';
        }  
    }


Savez-vous d'où peut venir l'erreur d'affichage ? Merci d'avance pour vos propositions !
Modifié par Oziris (19 Jan 2019 - 14:33)
Je ne sais pas, j'ai pourtant configuré
c::set('date.timezone', 'Europe/Paris');
, et lorsque je change la valeur timezone, rien ne bouge...
Modérateur
Bonjour,

Ce n'est pas aussi simple que ça. Les mauvais coups en la matière peuvent arriver de n'importe où.

Déjà, essaie d'afficher les heures en plus des jours et tu compares ça aux valeurs que tu voudrais obtenir. Si tu as systématiquement un écart d'1h alors faudra chercher quelle instruction est mal utilisée.

Après, tes arrondis, auxquels je ne n'ai rien compris (mais bon, aussi, je n'ai pas essayé de comprendre), peuvent très bien aussi perturber le truc s'ils sont faits au mauvais moment.

Amicalement,
Modifié par parsimonhi (19 Jan 2019 - 17:04)
Merci de m'éclaircir ! avec dump, les heures sont bonnes, que voulais-tu dire par "des arrondies au mauvais moment" ?
Modérateur
Bonjour,

Comment ça les heures sont bonnes ? Tu veux dire que tu obtiens 24h pile de décalage ?

Pour les arrondis, il faudrait que je me penche sur ton code en détail (une fois que j'aurai la réponse à la question ci-dessus). Si ça se trouve ton code est bon et le problème est ailleurs.

Note : je ne suis pas convaincu qu'il faille faire un setlocale.

Amicalement,
Modérateur
Bonjour,

Bon, on oublie ces histoires de time zone. Je confirme que c'est un problème d'arrondis.

Je ne sais pas d'où provient ta 2e liste, mais ils ne doivent pas faire les calculs exactement comme tu les fais.

Rien qu'en remplaçant floor() par round() on obtient des jours différents.

Il faudrait connaitre le calcul qui a été fait pour obtenir ta deuxième table.

EDIT: et il est possible aussi que le calcul fait par SunCalc soit légèrement différent de celui qui est fait pour obtenir la table 2.

Amicalement,
Modifié par parsimonhi (19 Jan 2019 - 21:51)
Merci encore pour le retour !

Effectivement, j'avais simplement fais un appel de date avant le foreach...Le problème est donc que j'obtiens environ 47 min de decalage avant le foreach et 1 minute de plus à chaque jours concernés :

edit : j'ai voulu mettre les emojis lunes mais elles n'apparaissent pas

01/19/2019 09:46:31 pm
???? Lundi 21 09:01:14
???? Lundi 28 09:01:14
???? Lundi 4 09:02:14
???? Mardi 5 09:02:14
???? Mardi 12 09:02:14
???? Mardi 19 09:02:14
???? Mardi 26 09:02:14
???? Mercredi 6 09:03:14
???? Jeudi 14 09:03:14
???? Mercredi 20 09:03:14

avec ceci :

date_default_timezone_set('Europe/Paris');
$today = date('m/d/Y h:i:s a', time());
echo $today . '<br>';
$date = new DateTime($today, new DateTimeZone('Europe/Paris'));

for( $days = 60; $days--; ) {
    setlocale(LC_TIME, "fr_FR");
    $datej = $date->modify( '+1 days' )->getTimestamp();
    $datejourX = strftime("%A %e", $datej);
    // initialise library class with date and coordinates today's sunlight times for Paris
    $sc = new SunCalc($date, 43.89, 4.08);

    // format sunrise time from the DateTime object
    $sunTimes = $sc->getSunTimes();
    // get position of the sun (azimuth and altitude) at today's sunrise
    $sunrisePos = $sc->getMoonIllumination($sunTimes['sunrise']);

    $sunp = $sunrisePos['phase'];
    //https://stackoverflow.com/questions/49036979/moon-phase-with-svg-graphics-in-node-js

    $datejour3 =  $sunp * 28;
    $datejour2 = floor($datejour3);
    $datejour = $datejour2 / 28;
    if ($datejour == 0) {
        echo "???? " . $datejourX . "&nbsp;" . date('h:m:s', $datej) . '<br>';
    } elseif ($datejour == 0.25) {
        echo "???? ". $datejourX . "&nbsp;" . date('h:m:s', $datej) . '<br>';
    } elseif ($datejour == 0.5) {
        echo "???? ". $datejourX . "&nbsp;" . date('h:m:s', $datej) . '<br>';
    } elseif ($datejour == 0.75)  {
        echo "???? ". $datejourX . "&nbsp;" . date('h:m:s', $datej) . '<br>';
    }  
}

Modifié par Oziris (19 Jan 2019 - 21:57)
Modérateur
Bonjour,

Oziris a écrit :
Effectivement, j'avais simplement fais un appel de date avant le foreach...Le problème est donc que j'obtiens environ 47 min de decalage avant le foreach et 1 minute de plus à chaque jours concernés


Je suis nul en astronomie. Du moment que tu t'y retrouves, c'est l'essentiel.

Oziris a écrit :
edit : j'ai voulu mettre les emojis lunes mais elles n'apparaissent pas


Tu veux les faire afficher via ton code ?

Si c'est bien ça, il faut que ta page soit en UTF8, et que la police de caractères employée soit capable d'afficher les caractère correspondants à ces emojis.

Si par contre, c'est dans ton message ici que ces emojis n'apparaissent pas, c'est normal: c'est la manière dont est fait le moteur du forum alsacreations qui fait que ces emojis sont remplacés par des ?.

Amicalement,
Hélas non je ne suis toujours pas satisfait par les résultats que me donne ce plugin. Je viens d'en changer pour celui ci : https://github.com/solarissmoke/php-moon-phase

et j'obtiens les bonnes phases comme ceci :

setlocale(LC_TIME, 'fr','fr_FR','fr_FR@euro','fr_FR.utf8','fr-FR','fra');
$moon = new MoonPhase();

$next_full = strftime( '%A %d/%m/%Y', $moon->full_moon() );
echo "????". $next_full . '<br>';

$next_first_quarter = strftime( '%A %d/%m/%Y', $moon->next_first_quarter() );
echo "????". $next_first_quarter . '<br>';

$next_last_quarter = strftime( '%A %d/%m/%Y', $moon->next_last_quarter() );
echo "????". $next_last_quarter . '<br>';

$next_new_moon = strftime( '%A %d/%m/%Y', $moon->next_new_moon() );
echo "????". $next_new_moon . '<br>';


mon problème est qu'avec ce plugin, je n'ai que quatre résulats, alors que j'en aurai voulu sur tout le mois, voir plus...
Modifié par Oziris (19 Jan 2019 - 22:24)