Autor Zpráva
jirka2
Profil
Ahoj,
narazil jsem na zajímavý problém. Pracuji s výpočtem východu a západu Slunce pomocí funkce date_sun_info(), Tento primitivní program
1<pre>
2<?php
3date_default_timezone_set("UTC");
4$sun_info = date_sun_info(strtotime("2025-03-13"), 51.48, 0.0);
5foreach ($sun_info as $key => $val) {
6    if ($val === true)
7        echo "{$key}: ++++\n";
8    elseif ($val === false)
9        echo "{$key}: -----\n";
10    else
11        echo "{$key}: " . date("H:i:s", $val) . "\n";
12}
<pre>
<?php
date_default_timezone_set("UTC");
$sun_info date_sun_info(strtotime("2025-03-13"), 51.480.0);
foreach ($sun_info as $key => $val) {
    if ($val === true)
        echo "{$key}: ++++\n";
    elseif ($val === false)
        echo "{$key}: -----\n";
    else
        echo "{$key}" . date("H:i:s"$val) . "\n";
}
Vrátí ve verzi PHP 7.4 toto:
1sunrise: 06:17:33
2sunset: 18:01:13
3transit: 12:09:23
4civil_twilight_begin: 05:44:28
5civil_twilight_end: 18:34:18
6nautical_twilight_begin: 05:05:36
7nautical_twilight_end: 19:13:09
8astronomical_twilight_begin: 04:25:40
9astronomical_twilight_end: 19:53:05
sunrise: 06:17:33
sunset: 18:01:13
transit: 12:09:23
civil_twilight_begin: 05:44:28
civil_twilight_end: 18:34:18
nautical_twilight_begin: 05:05:36
nautical_twilight_end: 19:13:09
astronomical_twilight_begin: 04:25:40
astronomical_twilight_end: 19:53:05
Podle autoritativních zdrojů na internetu jsou časy OK. Ale tentýž program vrátí ve verzi PHP 8.3 toto:
1sunrise: 06:15:56
2sunset: 18:02:49
3transit: 12:09:23
4civil_twilight_begin: 05:44:28
5civil_twilight_end: 18:34:18
6nautical_twilight_begin: 05:05:36
7nautical_twilight_end: 19:13:09
8astronomical_twilight_begin: 04:25:40
9astronomical_twilight_end: 19:53:05
sunrise: 06:15:56
sunset: 18:02:49
transit: 12:09:23
civil_twilight_begin: 05:44:28
civil_twilight_end: 18:34:18
nautical_twilight_begin: 05:05:36
nautical_twilight_end: 19:13:09
astronomical_twilight_begin: 04:25:40
astronomical_twilight_end: 19:53:05
Vznikl skoro dvouminutový rozdíl v časech východu a západu Slunce, to je dost. Přitom ostatní údaje jsou stejné, výpočet polohy Slunce se tedy nezměnil (navíc jsem koukal do zdrojáků PHP a změnu nenašel). Vypadá to, jako by se změnil úhel, který určuje čas východu či západu. Ale i ten se zdá být stejný (cca 50 uhlových minut). Změny date.sunrise_zenith na to nemají vliv.Už mě nenapadá, kde je problém. Někoho jiného ano? Předem děkuji za Váš čas a rady.
Keeehi
Profil
V dokumentaci je popsaná změna mezi 7.1 a 7.2. Bohužel proběhla změna i mezi 7.4 a 8.0, ta v dokumentaci zmíněná není. Tudíž ty nic neděláš špatně, jen se změnil kód.

Změna je ve čtvrtém parametru.
7.4
8.0

Pokud bys chtěl ve verzi 8.0 získat stejné chování jako v 7.4, mělo by to jít pomocí funkce date_sunset kde si můžeš zenith nastavit. Ale od 8.1 je označená za deprecated takže je otázka, na jak dlouho by to bylo.
jirka2
Profil
Keeehi:
Velice děkuji za reakci, tento rozdíl jsem přehlédl. Ale teď je to v PHP 8 chybně. V PHP 7.4 se funkce volala
rs = timelib_astro_rise_set_altitude(t, longitude, latitude, -35.0/60, 1, &ddummy, &ddummy, &rise, &set, &transit)
rs = timelib_astro_rise_set_altitude(t, longitude, latitude, -35.0/601, &ddummy, &ddummy, &rise, &set, &transit)
s hodnotou -35/60 {což je refrakce u obzoru) a uvnitř funkce se ještě odečítal úhlový průměr Slunce (to je asi 15/60 stupně) tak se došlo k správnému úhlu -50/60 stupně.
V PHP 8 se funkce volá
rs = timelib_astro_rise_set_altitude(t, longitude, latitude, -50.0/60, 1, &ddummy, &ddummy, &rise, &set, &transit);
rs = timelib_astro_rise_set_altitude(t, longitude, latitude, -50.0/601, &ddummy, &ddummy, &rise, &set, &transit);
Zde už je započítán průměr Slunce, ale ve funkci (která se nezměnila) se ještě jednou odečítá, takže dostanu úhel cca -65/60, což je špatně.
Jak to, že si toho doposud nikdo nevšiml...
Každopádně ještě jednou děkuji za pomoc, zdraví Jirka
Keeehi
Profil
jirka2:
Jak to, že si toho doposud nikdo nevšiml
Mám takový pocit, že tohle nebude zrovna moc užívaná funkce a těm co ji používají asi stačila přibližná přesnost a nevšimli si toho. Já bych to například nepoznal. Takže si zřejmě nikdo nevšiml. Možná by stálo za to to nahlásit jako bug.
Jediné issue co by to "řešilo" je tohle. Pokud by sis mohl zadat vlastní úhel, dalo by se to posunout o tu chybu co tam mají a dostat správný výsledek. Ale to je jen obcházení problémů.

Předpokládám, že to co jsi v kódu našel je opravdu chyba. Já tomuto tématu nerozumím a jestli se má opravdu někde něco přičíst odečíst a nebo ne, to nedokážu posoudit. Vypadáto, že o tomto tématu ty víš více.

Vaše odpověď

 +B+I+E+J,D+J,E+J,S+K+J,H+J,R+J,I 

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

0