Vrácení sekund ve formátu mm:ss   zodpovězená otázka

VB.NET

Zdravím,

chtěl bych se zeptat, jestli existuje nastavení String.Format nebo metoda objektu Date, která by dokázala z počtu sekund (např. 200) vrátit časovou hodnotu ve formátu mm:ss, zde tedy: 3:20?

Předem díky

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mel bych maly zvidavy dotaz:

Proc nemuzete proste pouzit klasicke operatory pro celociselne deleni a zbytek po deleni?

Jinak pomoci objektu se tohle resi spis pres TimeSpan nez pres string.Format nebo Date, mam pocit, ze oboji slouzi k necemu jinemu, nez je hrani si s casovym intervalem (na to je prave ta TimeSpan).

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Tak o TimeSpan jsem neuvažoval a díky za tip, a teď k Vašemu malému zvídavému dotazu: jistě, šlo by to, jen mě už unavuje takové banální operace psát a tak mě napadlo, že je to jistě už řešeno a obsaženo v .NET FW, a chci vědět kde to najít a jak to využít, protože znalost takovýchto drobností je důležitým prvkem efektivity práce.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

TimeSpan je naprostá kravina, nedají se na něj používat formátovací funkce. Jedinou možností, jak to udělat "systémově", je toto:

Dim d As Date
d = d.AddSeconds(200)
MsgBox(String.Format("200 sekund je {0:mm:ss}.", d))

Vzhledem k tomu, že to ale je na 3 řádky, a režie uvnitř objektu Date je poměrně velká, bych se také přikláněl k možnosti využít celočíselné dělení a zbytek.

Abyste nemusel pokaždé vypisovat (s \ 60) & ":" & (s Mod 60) a ještě části za dvojtečkou přidat nulu, pokud je menší než 10, asi nejlepší bude, když si napíšete funkci FormatSeconds, které předáte počet sekund a ona vám vrátí text v požadovaném formátu. Její použití pak v kódu bude už přímočaré.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Vzhledem k tomu, že operaci provádím každou sekundu, snažím se najít nejméňe paměťově náročné řešení. Použil jsem TimeSpan, zdá se mi ideální, protože pracuji s poměrně krátkými časovými údaji a když ho nakrmím 200 sekudami, můžu se ho zeptat na ts.Seconds a ts.Minutes, následovně:

dim ts as new timespan(0,0,200)
msgbox(ts.minutes.tostring & ":" & iif(ts.seconds<10, "0" & ts.seconds.tostring, ts.seconds.tostring))

Funguje to podle představ, ikdyž si nejsem jistý jestli je to zrovna elegantní řešení, nicméňe funguje.

Děkuji Vám oběma

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No to je právě zbytečně komplikované a neefektivní, objekt TimeSpan i objekt Date má vnitřně poměrně velkou režii. Zadaný počet sekund se převede na počet ticků od nějakého data (1 tick = 100 nanosekund nebo tak nějak, teď přesně nevím) a pak to zase převádíte zpětně. Daleko přímočařejší a paměťově úsporné je pak již tohle řešení:

String.Format("{0}:{1:00}", s \ 60, s Mod 60)

, kde s je počet sekund.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Velký dík, jde mi hlavně o to, aby to moc nezatěžovalo a inicializace objektů není to pravé, když by se měla operace provádět každou sekundu.

Takže ještě jednou díky

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback