Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Algoritmus na kalkulačku stáří - roky, měsíce a dny

Aktivity
Avatar
Filip
Člen
Avatar
Filip:15.1.2018 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.1.2018 17:59
Avatar
Martin Petrovaj
Tvůrce
Avatar
Odpovídá na Filip
Martin Petrovaj:15.1.2018 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.1.2018 18:02
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Filip
Člen
Avatar
Filip:15.1.2018 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.1.2018 18:07
Avatar
Martin Petrovaj
Tvůrce
Avatar
Odpovídá na Filip
Martin Petrovaj:15.1.2018 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.1.2018 18:17
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
martin.vip
Člen
Avatar
Odpovídá na Filip
martin.vip:15.1.2018 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
15.1.2018 18:32
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Filip
Petr Čech:15.1.2018 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
15.1.2018 18:35
the cake is a lie
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na martin.vip
Petr Čech:15.1.2018 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.1.2018 18:38
the cake is a lie
Avatar
Odpovídá na Petr Čech
Marian Benčat:15.1.2018 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.1.2018 18:47
Nahoru Odpovědět
15.1.2018 18:46
Totalitní admini..
Avatar
martin.vip
Člen
Avatar
Odpovídá na Petr Čech
martin.vip:15.1.2018 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.1.2018 18:59
Avatar
Odpovídá na martin.vip
Marian Benčat:15.1.2018 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
15.1.2018 19:01
Totalitní admini..
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Marian Benčat
Jan Vargovský:15.1.2018 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
15.1.2018 22:37
Avatar
Odpovídá na Jan Vargovský
Marian Benčat:16.1.2018 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.1.2018 0:47
Nahoru Odpovědět
16.1.2018 0:45
Totalitní admini..
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Marian Benčat
DarkCoder:16.1.2018 1:34

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

Nahoru Odpovědět
16.1.2018 1:34
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Marian Benčat:16.1.2018 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.1.2018 9:53
Totalitní admini..
Avatar
Marian Benčat:16.1.2018 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.1.2018 9:57
Nahoru Odpovědět
16.1.2018 9:57
Totalitní admini..
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Marian Benčat
Petr Čech:16.1.2018 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.1.2018 10:29
the cake is a lie
Avatar
Odpovídá na Petr Čech
Marian Benčat:16.1.2018 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.1.2018 10:35
Totalitní admini..
Avatar
Jakub Augusta:16.1.2018 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.1.2018 10:41
if(true == false) { Tu: DoDis() } else goto Tu;
Avatar
Jan Vargovský
Tvůrce
Avatar
Jan Vargovský:16.1.2018 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.1.2018 13:23
 
Nahoru Odpovědět
16.1.2018 13:20
Avatar
DarkCoder
Člen
Avatar
DarkCoder:16.1.2018 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.1.2018 14:08
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
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.