Letní akce! Lákají tě IT školení C#, Javy a PHP v Brně? Přihlas se a napiš nám do zpráv kód "BRNO 500" pro slevu 500 Kč na libovolný brněnský kurz. Lze kombinovat se slevami uvedenými u školení i použít pro více kurzů. Akce končí 28.7.
Avatar
Filip
Člen
Avatar
Filip:15. ledna 17:59

Ahoj, pomůže mi prosim někdo vymyslet algoritmus na kalkualčku, která dokáže po zadání aktuálního data a data narození spočítat stáří v letech, měsících a dnech? Už se tu s tím skoro hodinu peru a pořád nic :/
Diky moc

 
Odpovědět 15. ledna 17:59
Avatar
Martin Petrovaj
Překladatel
Avatar
Odpovídá na Filip
Martin Petrovaj:15. ledna 18:02

Skús https://msdn.microsoft.com/…vs.110).aspx

Uvedená metóda vráti rozdiel medzi dvoma inštanciami DateTime (napríklad medzi aktuálnym dátumom a dátumom narodenia) ;-)

Nahoru Odpovědět 15. ledna 18:02
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Filip
Člen
Avatar
Filip:15. ledna 18:07

Děkuji. Neexistuje nějaký způsob, jak si tuto metodu nějak "otevřít"? Strašně mě zajímá, jak takový algoritmus pro výpočet vypadá. Děkuji

 
Nahoru Odpovědět 15. ledna 18:07
Avatar
Martin Petrovaj
Překladatel
Avatar
Odpovídá na Filip
Martin Petrovaj:15. ledna 18:17

To som ja osobne zatiaľ nerobil, s tým ti bude musieť poradiť asi niekto iný. Ale skús sa pozrieť sem: https://stackoverflow.com/…itten-inside

Ak by si si to ale chcel naozaj napísať sám, tak by som išiel cez vlastnosti, ktoré DateTime poskytuje:
https://msdn.microsoft.com/….110%29.aspx?…
(časť Properties)
Najjednoduchšie by bolo asi odčítať vlastnosť Ticks oboch inštancií.

Nahoru Odpovědět 15. ledna 18:17
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
martin.vip
Člen
Avatar
Odpovídá na Filip
martin.vip:15. ledna 18:32

myslím že jsem něco podobného řešil, nepsal jsem teda vlastní metodu, ale jedna možnost bych řekl že je, rozparsovat datum na rok, měsic a den zjistit zda je přestpuný nebo ne a pak odečíst, další je že se datumy převedou na číslo odečtou se a zpět vrátí do datumu... už nevím jak se to jmenuje, ale i na to je metoda... je to podobné jako v excelu, 1.1.1900 je tuším 1

 
Nahoru Odpovědět  -1 15. ledna 18:32
Avatar
Petr Čech
Redaktor
Avatar
Odpovídá na Filip
Petr Čech:15. ledna 18:35

Ano, tady je přímo zdrojový kód: http://referencesource.microsoft.com/#…
Do školy jsem dělal něco relativně podobného a mohu tě ujistit, že práce s čase je neuvěřitelně zrádná a chceš, aby to za tebe obstarala knihovna.

Nahoru Odpovědět  +1 15. ledna 18:35
Life doesn't give you lemons. You need to grow them patiently and then sell the lemonade.
Avatar
Petr Čech
Redaktor
Avatar
Odpovídá na martin.vip
Petr Čech:15. ledna 18:38

Mluvíš o Unix time a trochu jsi se spletl... 1.1.1970 je 0 :D . Každopádně, snad všechno, co pracuje s čase funguje tak že se vše převede na jedno číslo, takže potom je jednoduché udělat třeba rozdíl, součet, prakticky všechno a celé to je konzistentní, protože operuješ jen s jedním číslem kromě funkcí, co to převádí z a na lidskyy čitelný formát.

Nahoru Odpovědět 15. ledna 18:38
Life doesn't give you lemons. You need to grow them patiently and then sell the lemonade.
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na Petr Čech
Marian Benčat:15. ledna 18:46

No ono to tak úplně primitivní úloha "až do konce" není. Například určit, jestli je 1 měsíc 28-29-30-31 dní? :-) Je tedy člověk starý 696 hodin 1měsíc starý a 1 den, nebo 29dní starý? Pro takovéto výpočty se to nejčastěji bere synodický měsíc, takže 29,5 dne (zaokrouhluje se nahoru na 30)

Editováno 15. ledna 18:47
Nahoru Odpovědět 15. ledna 18:46
Totalitní admini..
Avatar
martin.vip
Člen
Avatar
Odpovídá na Petr Čech
martin.vip:15. ledna 18:59

jo, už jsem s tím dlouho nepracoval a bral jsem to tak jak to ukáže excel, to si můžeš zkusit, zadat 1.1.1900 a změnit na číslo....

dále je nutné brát v potaz další věc a tou je přechodný rok, který má také svůj algoritmus

 
Nahoru Odpovědět 15. ledna 18:59
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na martin.vip
Marian Benčat:15. ledna 19:01

Uprimne,.. pouzil bych knihovny, ktere ma .net a ten umi normalne datumy odecitat, to vyflusne timespan a ten ma na sobe dalsi getery a metody.

Nahoru Odpovědět  +2 15. ledna 19:01
Totalitní admini..
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Marian Benčat
Jan Vargovský:15. ledna 22:37

Odkud bereš ty počty na dni v měsíci? Však všechny kromě února jsou statické a únor závisí na přestupném roku. Vypočítat přestupný rok je lehké.

 
Nahoru Odpovědět  +1 15. ledna 22:37
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na Jan Vargovský
Marian Benčat:16. ledna 0:45

Narodil jsem se 16.12. 2017 a ted je 16.1.2018. Tedy 31 dni.. Je mi podle tebe 1 měsíc a jeden den, nebo 1 měsíců a 0 dnu, nebo 1 měsíc a 3 dny, nebo 1 měsíc a 2 dny?:) měsíc totiž není jasné definovány časový úsek a ty mas z poctu dnů vypsat jak je člověk starý.

Editováno 16. ledna 0:47
Nahoru Odpovědět 16. ledna 0:45
Totalitní admini..
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Marian Benčat
DarkCoder:16. ledna 1:34

Tvůj věk by byl přesně: 0 let, 1 měsíců, 0 dní.

Nahoru Odpovědět 16. ledna 1:34
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na DarkCoder
Marian Benčat:16. ledna 9:53

To nemusí být pravda. Protože někdo / něco může mít jako "1 měsíc" definováno 30 dní, někdo jiný (jiný systém) 31dní.

1 month prostě není přesný údaj.

Nahoru Odpovědět 16. ledna 9:53
Totalitní admini..
Avatar
Marian Benčat
Redaktor
Avatar
Marian Benčat:16. ledna 9:57

Pro zajímavost, google třeba jako měsíc vnímá 30.4 dne, tedy 30 dní.
https://www.google.cz/search?…

Editováno 16. ledna 9:57
Nahoru Odpovědět 16. ledna 9:57
Totalitní admini..
Avatar
Petr Čech
Redaktor
Avatar
Odpovídá na Marian Benčat
Petr Čech:16. ledna 10:29

No, mě ten výsledek vyhodil 29.53 dní, takže... to asi nebude úplně dobře.
Máš pravdu, ale tohle je něco, co je prostě pevně daná konstanta, kterou se podělí rozdíl v času třeba v sekundách nebo ticích. Ale ani to není dobrý nápad, s měsícem prostě nepracuješ (ani .NET TimeSpan s tím nepracuje) a bereš jen to, co je dobře definováno, tedy dny a menší jednotky.
Tedy... mohli bychom se bavit o srandách jako třeba přestupné sekundy, ale to asi není potřeba :D

Nahoru Odpovědět 16. ledna 10:29
Life doesn't give you lemons. You need to grow them patiently and then sell the lemonade.
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na Petr Čech
Marian Benčat:16. ledna 10:35

http://referencesource.microsoft.com/#…

todle je treba husty :D Koukni na to, je to určitě "zajímavý" způsob jak třeba dělá .NET AddMonth()

Nahoru Odpovědět 16. ledna 10:35
Totalitní admini..
Avatar
Jakub Augusta:16. ledna 10:41
DateTime Now = DateTime.Now;
DateTime Dn = new DateTime(2000,1,1);
DateTime Out;
int day = 0;
int month = 0;
int year = 0;

year = Convert.ToInt32(Now.Year) - Convert.ToInt32(Dn.Year);

if (Now.Month > Dn.Month || Now.Month == Dn.Month) month = Convert.ToInt32(Now.Month) - Convert.ToInt32(Dn.Month);
else
{
    month = (Convert.ToInt32(Now.Month) + 12) - Convert.ToInt32(Dn.Month);
    year--;
}

if (Now.Day > Dn.Day || Now.Day == Dn.Day) day = Convert.ToInt32(Now.Day) - Convert.ToInt32(Dn.Day);
else if (Now.Month == 1 || Now.Month == 3 || Now.Month == 5 || Now.Month == 7 || Now.Month == 8 || Now.Month == 10 || Now.Month == 12) { day += 31; month--; }
else if (Now.Month == 2) { day += 28; month--; }
else if (Now.Month == 2 && DateTime.IsLeapYear(DateTime.Now.Year)) { day += 29; month--; }
else { day += 30; month--; }

if (month == -1) { month += 12; year--; }
Console.WriteLine("Jsi starý:" + year + " let, " + month + " měsíců, " + day + " dnů");
Console.ReadLine();

Co třeba toto ?

Nahoru Odpovědět 16. ledna 10:41
if(true == false) { Tu: DoDis() } else goto Tu;
Avatar
Jan Vargovský
Redaktor
Avatar
Jan Vargovský:16. ledna 13:20

Vnímám to stejně jako Google, jen jednoduše jako 365,25 / 12. Až teď jsem pochopil co jsi tím chtěl vyjádřit. Já to první od tebe pochopil tak, že nevíš kolik má měsíc dní :D takhle s tebou souhlasím, že určit stáří na dny dokážeš hned, na roky taky, ale u těch měsíců je to relativní a nevím jestli se to bere podle průměru (ten výpočet na průměrný počet dní v měsíci) nebo jak :)

btw, to tu netáhám ještě přestupnou sekundu a podobné srandy. Souhlasím, že bych to nechal počítat knihovny, které by s tím měly umět pracovat (haha javascript a timezony v něm).

Editováno 16. ledna 13:23
 
Nahoru Odpovědět 16. ledna 13:20
Avatar
DarkCoder
Člen
Avatar
DarkCoder:16. ledna 14:08

Doporučuji shlédnout diskuzní fóra kde maminky horlivě řeší, kdy bude jejich ratolesti právě X měsíců. Namátkově jsem pár takových navštívil a četnost těchto dotazů je s nadsázkou zhruba stejná jako četnost podmíněných příkazů použitých programátorem v programu. :-D

Nahoru Odpovědět 16. ledna 14:08
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 20 zpráv z 20.