Jak získat počet týdnů v roce – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak získat počet týdnů v roce – PHP – Fórum – Programujte.comJak získat počet týdnů v roce – PHP – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
ingiraxo+15
Grafoman
21. 5. 2021   #1
-
0
-

Ahoj,

řeším takový problém. Potřeboval bych získat počet týdnů v roce. Ale pro každý rok zvlášť. Bohužel se mi stává, že místo, aby to vždy vrátilo počet, tak to vrací něco jiného.

$years = [2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025];

foreach ($years as $year) {
    $weeks = idate('W', strtotime('1.1.' . $year));
    echo $year . ' = ' . $weeks . '<br/>';
}

Výstup je: 

2018 = 1
2019 = 1
2020 = 1
2021 = 53
2022 = 52
2023 = 52
2024 = 1
2025 = 1

Můžete mi poradit nebo navést, jak mám prostě udělat, abych pro každý rok získat počet týdnů?

Tam kde to potřebuju, tak mi na vstupu přijde datum jako v podobě time(), vytáhnu z toho rok a podle něj potřebuju získat počet týdnů.

PS: Napadlo mě 365/7, ale to nezohledňuje přestupné roky, takže bych potřeboval ideálně nějaký PHP oficiální řešení a né nějaký rádoby výpočet, co v 98% bude fungovat.

Díky ;)

Nahlásit jako SPAM
IP: 95.85.216.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
ingiraxo+15
Grafoman
21. 5. 2021   #2
-
0
-

Tak jsem to už možná vyřešil   

Můj druhý pokus byl, že když "W" vrací týdny od prvního pondělí v roce, tak jsem zkusil 

$year = 2020;
$date = date('d.m.Y', strtotime('first monday of ' . $year . '-01'));
$weeks = idate('W', strtotime($date));

Bohužel, i když jsem doufal, že to pojede, tak nejede a vrací to (nechápu proč) 1 a 2.

Potom jsem objevil, že to jde udělat takto: 

$year = 2020;
$date = new DateTime();
$date->setISODate($year, 53);
$weeks = ($date->format('W') === '53') ? 53 : 52;

A to se zdá že funguje. Pokud někdo máte lepší řešení, tak sem s ním.

Nahlásit jako SPAM
IP: 95.85.216.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
gna
~ Anonymní uživatel
1851 příspěvků
21. 5. 2021   #3
-
0
-

52 a kousek. Vždycky.

Nahlásit jako SPAM
IP: 213.211.51.–
ingiraxo+15
Grafoman
21. 5. 2021   #4
-
0
-

#3 gna
Pro výpočty to není pravda, to je stejné jako tvrdit, že rok má vždy 365 dní ;)

Nahlásit jako SPAM
IP: 95.85.216.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
gna
~ Anonymní uživatel
1851 příspěvků
21. 5. 2021   #5
-
0
-

Já teda vím jen o jednom přestupném dnu, takže podle mě rok má vždycky 365 nebo 366 dní.

365 dní je 52 týdnů a 1 den.
366 dní je 52 týdnů a 2 dny.

Vždycky.

Nahlásit jako SPAM
IP: 213.211.51.–
Řešení
ingiraxo+15
Grafoman
21. 5. 2021   #6
-
0
-
Vyřešeno Nejlepší odpověď

#5 gna
To je sice super, ale je to potřebuju ve výpočtu. Nemůžu použít konstantu 53...

Nicméně ještě jsem zkoušel a mělo by splnit funkci i tohle s tím, že je to o 80% rychlejší než přes DateTime

$year = 2020;
$weeks = 52 + idate('L', strtotime('1.1.' . $year));
Nahlásit jako SPAM
IP: 95.85.216.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
gna
~ Anonymní uživatel
1851 příspěvků
21. 5. 2021   #7
-
0
-

Jestli ti jde o číslování týdnů, tak 28.12. je vždycky v posledním týdnu. 

foreach ($years as $year) {
    echo $year . ' = ' . (new DateTime("28.12.$year"))->format('W') . '<br/>';
}
Nahlásit jako SPAM
IP: 213.211.51.–
ingiraxo+15
Grafoman
21. 5. 2021   #8
-
0
-

#7 gna
Ne, jde mi o počet týdnů v roce. Potřebuju vědět, jaký má 52 a jaký 53 týdnů. Resp. ziskat pocet tydnu pro konkretní rok.

To co si poslal neodpovídá tomu, jak to skutečně je, protože následující přestupné roky budou: 2024, 2028, 2032, 2036, 2040, ... a ty mají 53 týdnů. Ten formát "W" je vždy vypočtený od  prvního pondělí daného měsíce. A to prostě neodpovídá tomu, jak bych to potřeboval. Takže ideální a nejsnažší řešení je "L" a prostě přidat týden když jde o přestupný rok.

Nahlásit jako SPAM
IP: 95.85.216.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
gna
~ Anonymní uživatel
1851 příspěvků
21. 5. 2021   #9
-
0
-

Pokud jde o číslování kalendářních týdnů, tak když zjistíš číslo posledního týdne roku, tak zjistíš kolik týdnů je v tom roce.

Já si s radostí nechám vysvětlit, o co se snažíš. Zatím je každý tvůj příspěvek v téhle diskuzi naprostá krávovina.

Nahlásit jako SPAM
IP: 213.211.51.–
ingiraxo+15
Grafoman
21. 5. 2021   #10
-
0
-

#9 gna
Já ale nedělám žádný kalendář. Je mi úplně jedno, jak je to tam dělaný. Potřeboval jsem pouze zjistit podle roku, jestli má ten rok 52 nebo 53 týdnů. Protože bohužel existují i přestupný roky. A  date() s "W" mi vrací občas 1 místo počtu týdnů, takže jsem to vyřešil tak, jak jsem psal výše.

To, co si napsal ty:

(new DateTime("28.12.$year"))->format('W')

Je právě blbost. To se možná používá u kalendáře, ale určitě ne na zjištění počtu týdnů v roce. Protože ti to vrací 53 týdnů u roků, který nejsou přestupný.

Nahlásit jako SPAM
IP: 95.85.216.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
gna
~ Anonymní uživatel
1851 příspěvků
22. 5. 2021   #11
-
0
-

Bežný rok má 365 dní, to je 52 týdnů a 1 den. Přestupný rok má 366 dní, to je 52 týdnů a 2 dny. Takže rok jako takový nikdy nemá právě 52 anebo 53 týdnů! A už teď by ti při sčítání jedniček a dvojek mělo něco docházet.

Ale při počítání kalendářních týdnů se samozřejmě počítají celé týdny a podle toho, jak ti vyjde týden na přelomu roku, tak se počítá jako první týden nového roku, nebo poslední týden předchozího roku. A tam se můžeš dostat na 52 nebo 53 týdnů. Přestupný rok s tím samořejmě hýbe, ale ne tak, že by každý přestupný rok měl 53 týdnů. Většina lidí umí počítat do sedmi už ve školce.

Nahlásit jako SPAM
IP: 213.211.51.–
Kartmen
~ Anonymní uživatel
57 příspěvků
24. 5. 2021   #12
-
0
-

Přestupný rok se počítá takto

    public static bool PrestupnyRok(int rok)
    {
      return rok % 4 == 0 && (rok % 100 != 0 || rok % 400 == 0); //rok neni presne 365.25 dne, ale 365.2425, proto jsou prestupne i roky 2100, 2200, 2300, 2500, 2600..
    }
Nahlásit jako SPAM
IP: 78.80.151.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

Podobná vlákna

Jak ziskat checkboxy — založil Gibon

Jak získat praxi a učit se v IT — založil Radek Hlaváček

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý