Diskuze: Algoritmus na kalkulačku stáří - roky, měsíce a dny
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 20 zpráv z 20.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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)
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í.
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
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.
Mluvíš o Unix time a trochu jsi se spletl... 1.1.1970 je 0 . 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.
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)
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
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.
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é.
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ý.
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.
Pro zajímavost, google třeba jako měsíc vnímá 30.4 dne, tedy 30
dní.
https://www.google.cz/search?…
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
http://referencesource.microsoft.com/#…
todle je treba husty Koukni na to, je to určitě "zajímavý" způsob jak třeba dělá .NET AddMonth()
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 ?
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í 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).
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.
Zobrazeno 20 zpráv z 20.